Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

LaTeX wyrazenie regularne do zamiany znaków specjalnych

50 views
Skip to first unread message

Cezary Grądys

unread,
Mar 14, 2014, 7:12:18 AM3/14/14
to
Potrzeguję w tekscie zamienić znaki specjalne typu '\ & # %'
na odpowiedniki możliwe do wydruku. To chyba typowy problem, może ktoś
ma gotowe wyrazenie regularne?

Na razie próbuję tak (perl):

$opis_problemu =~ s/\\/\$\\backslash\$/g ;
$opis_problemu =~ s/([\&\$\%\#\_\{\}])/\\$1/g ;
$opis_problemu =~ s/~/\\~{}/g ;

Było by OK gdyby nie ten '$' dodawany w 1 linijce, w drugiej jest
zamieniany i lipa ):

A może jest inna metoda na wydruk '\' niż $\backslas$ ?



--
Cezary Grądys
czar...@wa.onet.pl

Jarosław Sokołowski

unread,
Mar 14, 2014, 8:10:42 AM3/14/14
to
Pan Cezary Grądys potrzebuje w tekscie zamienić znaki specjalne
typu '\ & # %' na odpowiedniki możliwe do wydruku:

> To chyba typowy problem, może ktoś ma gotowe wyrazenie regularne?
>
> Na razie próbuję tak (perl):
>
> $opis_problemu =~ s/\\/\$\\backslash\$/g ;
> $opis_problemu =~ s/([\&\$\%\#\_\{\}])/\\$1/g ;
> $opis_problemu =~ s/~/\\~{}/g ;
>
> Było by OK gdyby nie ten '$' dodawany w 1 linijce, w drugiej jest
> zamieniany i lipa ):
>
> A może jest inna metoda na wydruk '\' niż $\backslas$ ?

Zacznijmy od tego, że nie są to 'znaki specjalne' jakiegoś jednego typu,
tylko znaki, które należą do różnych *kategorii*. I tak # ma kategorię 6
(parameter character), znak % kategorię 14 (comment character), znak &
kategorię 4 (alignment tab), a znak \ kategorię 0, czyli 'active", co
oznacza, że tworzy on sekwencje bądź znaki sterujące.

Z tymi trzema pierwszymi poradzić sobie można łatwo nadając im kategorię
11 (other), do której należą na przykład znaki interpunkcyjne. Piszemy:

\catcode`\&=11
\catcode`\#=11
\catcode`\%=11

i od tej pory nie możemy przy ich pomocy tworzyć tabel, makr i komentarzy,
ale za to drukują się takie, jakie są.

Można też zaryzykować polecenie

\catcode`\\=11

co sprawi, że niczego już więcej nie zdefiniujemy. Czasem nie trzeba
więcej definicji, i to się sprawdza. Jeśli nie, to można wcześniej
nadać zerową kategorię innemu znakowi, o którym wiemy, że nie będzie
nigdy drukowany. Na przykład:

\catcode`\|=0

sprawi, że będzie można (i trzeba) pisać:

|def|foo{bar}

zamiast:

\def\foo{bar}

--
Jarek

Cezary Grądys

unread,
Mar 14, 2014, 12:06:06 PM3/14/14
to
W dniu 14.03.2014 13:10, Jarosław Sokołowski pisze:

> Zacznijmy od tego, że nie są to 'znaki specjalne' jakiegoś jednego typu,
> tylko znaki, które należą do różnych *kategorii*. I tak # ma kategorię 6
> (parameter character), znak % kategorię 14 (comment character), znak &
> kategorię 4 (alignment tab), a znak \ kategorię 0, czyli 'active", co
> oznacza, że tworzy on sekwencje bądź znaki sterujące.
>
> Z tymi trzema pierwszymi poradzić sobie można łatwo nadając im kategorię
> 11 (other), do której należą na przykład znaki interpunkcyjne. Piszemy:
>
> \catcode`\&=11
> \catcode`\#=11
> \catcode`\%=11
>
> i od tej pory nie możemy przy ich pomocy tworzyć tabel, makr i komentarzy,
> ale za to drukują się takie, jakie są.
>

Dzięki serdeczne, to się może przyda, ale tu akurat mam to w tabeli.
Wpadłem na taki pomysł, że zamienię ten $ na tabulację i nie bedzie
przeszkadzał, a potem z powrotem tabulację na $. Trochę to nieelegancko,
ale powinno zadziałać. Tabulacji raczej w tym tekscie nie będzie, bo
jest to czytane z pliku csv gdzie pola rozdzielone są tabulacją. Więc
jakby co problem wystąpi wcześniej.


--
Cezary Grądys
czar...@wa.onet.pl

Jarosław Sokołowski

unread,
Mar 14, 2014, 1:27:11 PM3/14/14
to
Pan Cezary Grądys napisał:
Rolę tabulatora niekoniecznie musi pełnić ampersand (&), kategorię 4
można nadać również innemu znakowi, na przykład "|" i łykać tabele,
w których kolumny oddzielane są oldskulowo znakiem kreski pionowej.
TeX nie jest systemem, w którym znaki alfabetu wejściowego pełnią
z góry określoną funkcję. To można zmieniać, można określić co jest,
a co nie jest literą, co jest tabulatorem, co zaznacza komentarz itd.
Jak komuś żal znaków ASCII na te specjalne zastosowania, może użyć
znaków z drugiej połówki tabeli ośmiobitowyej i na przykład komentarze
oznaczać przez §, a uwalniając % jako normalnie drukowany znak.

Teraz dopiero zauważyłem, że w opisywanej sytuacji czytanie inputu
ze znakami o niedrukowalnych kategoriach, to tylko część problemu.
Zdaje się, że problemem jest również drukowanie tych znaków.
Napisanie $\backslash$, gdy chcemy po prostu uzyskać "\", to chyba
najgorsze rozwiązanie. Lepiej napisać \char92. W przypadku użycia
$$, otrzymamy znak z zupełnie innego fontu, przeznaczonego do składu
wyrażeń matematycznych.

--
Jarek

Cezary Grądys

unread,
Mar 18, 2014, 10:22:54 AM3/18/14
to
W dniu 14.03.2014 18:27, Jarosław Sokołowski pisze:

> Rolę tabulatora niekoniecznie musi pełnić ampersand (&), kategorię 4
> można nadać również innemu znakowi, na przykład "|" i łykać tabele,
> w których kolumny oddzielane są oldskulowo znakiem kreski pionowej.
> TeX nie jest systemem, w którym znaki alfabetu wejściowego pełnią
> z góry określoną funkcję. To można zmieniać, można określić co jest,
> a co nie jest literą, co jest tabulatorem, co zaznacza komentarz itd.
> Jak komuś żal znaków ASCII na te specjalne zastosowania, może użyć
> znaków z drugiej połówki tabeli ośmiobitowyej i na przykład komentarze
> oznaczać przez §, a uwalniając % jako normalnie drukowany znak.
>
> Teraz dopiero zauważyłem, że w opisywanej sytuacji czytanie inputu
> ze znakami o niedrukowalnych kategoriach, to tylko część problemu.
> Zdaje się, że problemem jest również drukowanie tych znaków.
> Napisanie $\backslash$, gdy chcemy po prostu uzyskać "\", to chyba
> najgorsze rozwiązanie. Lepiej napisać \char92. W przypadku użycia
> $$, otrzymamy znak z zupełnie innego fontu, przeznaczonego do składu
> wyrażeń matematycznych.
>


Prawdziwym problemem jest to, że jest to wydruk raportu z bazy danych i
tak naprawdę nie wiem co tam może zostać wpisane przez użytkownika.
Zakładam, że tabulacji nie będzie, bo te dane wpisuja przez przeglądarkę
i tam tabulacja powoduje tylko przeskok do innego pola.
Pomysł z wpisywaniem \char92 jest chyba tym co potrzebuję.
A na marginesie, oryginalne wydruki z tego systemu nie zawierają
praktycznie polskich znaków (zamiast ą jest spacja, tylko ł koślawo
wychodzi), więc to że coś bedzie trochę nie taką czcionką to naprawdę
mały problem. To bedzie połozone w szafie i leżeć pewnie przez 10 lat,
albo i dłużej, nikt tego czytał nie będzie. Może w razie kontroli.
Jeszcze raz dzięki.


--
Cezary Grądys
czar...@wa.onet.pl

Jarosław Sokołowski

unread,
Mar 18, 2014, 12:47:47 PM3/18/14
to
Pan Cezary Grądys napisał:

> Prawdziwym problemem jest to, że jest to wydruk raportu z bazy danych i
> tak naprawdę nie wiem co tam może zostać wpisane przez użytkownika.
> Zakładam, że tabulacji nie będzie, bo te dane wpisuja przez przeglądarkę
> i tam tabulacja powoduje tylko przeskok do innego pola.

Trochę się gubię w tym, kiedy o jaką tabulację chodzi. Czy o TeXową (&),
czy o znaki tabulacji ASCII (\t). Znaki tabulacji TeX zazwyczaj traktuje
jak spacje, choć i to można zmienić.

> Pomysł z wpisywaniem \char92 jest chyba tym co potrzebuję.

Ale ja bym to zrobił inaczej. Jak się tworzy system, który ma drukować
coś z baz danych, to najlepiej zrobić tak, że wszystkie znaki stamtąd
pochodzące kopiowane są na wyjście jeden-do-jednego. Czyli należą do
kategorii 11 (letter) lub 12 (other). Należy zacząć od sporządzenia
listy legalnych znaków i filtrować na wyjściu bazy wszystko, co do tej
listy nie należy. Czasem tylko może okazać się konieczny dodatkowy znak
'active', ale nie musi to wcale być standardowy "\", zerową kategorię
można nadać czemuś uznanemu za 'nielegalne' -- np. jakiś ÷ lub ostatecznie
litera spoza alfabetu polskiego.

> A na marginesie, oryginalne wydruki z tego systemu nie zawierają
> praktycznie polskich znaków (zamiast ą jest spacja, tylko ł koślawo
> wychodzi), więc to że coś bedzie trochę nie taką czcionką to naprawdę
> mały problem. To bedzie połozone w szafie i leżeć pewnie przez 10 lat,
> albo i dłużej, nikt tego czytał nie będzie. Może w razie kontroli.

Pewnie użyty jest domyślny font CMR, w którym akurat ogonków nie ma.
Lepiej załadować coś innego -- najlepiej font obecny w drukarkach
i w acrobet readerze (Times, Helvetica). Poza tym LaTeX w takich
automatach przeważnie jest zbędny -- wystarczy plain TeX.

--
Jarek

Przyjazny

unread,
Mar 20, 2014, 6:20:47 PM3/20/14
to
Właściwie czy są jakieś przeciwwskazania do użycia \verbatim z
pakietu verbatim? Jeżeli potrzeba, żeby to było zwykłym krojem to można
przedefiniować \verbatim@font. Działa w polach typu "p", w zwykłych da
się niestety tylko skorzystać z \verb.

Ewentualnie jeżeli to nie jest możliwe, to w dokumentacji tegoż pakietu
jest dość dokładnie napisane co jak jest zrobione i dlaczego.
0 new messages