Discussion:
LaTeX wyrazenie regularne do zamiany znaków specjalnych
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Cezary Grądys
2014-03-14 11:12:18 UTC
Permalink
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
***@wa.onet.pl
Jarosław Sokołowski
2014-03-14 12:10:42 UTC
Permalink
Pan Cezary Grądys potrzebuje w tekscie zamienić znaki specjalne
To chyba typowy problem, może ktoś ma gotowe wyrazenie regularne?
$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
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
2014-03-14 16:06:06 UTC
Permalink
Post by Jarosław Sokołowski
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ę
\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
***@wa.onet.pl
Jarosław Sokołowski
2014-03-14 17:27:11 UTC
Permalink
Post by Cezary Grądys
Post by Jarosław Sokołowski
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ę
\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.
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
2014-03-18 14:22:54 UTC
Permalink
Post by Jarosław Sokołowski
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
***@wa.onet.pl
Jarosław Sokołowski
2014-03-18 16:47:47 UTC
Permalink
Post by Cezary Grądys
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ć.
Post by Cezary Grądys
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.
Post by Cezary Grądys
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
2014-03-20 22:20:47 UTC
Permalink
Post by Cezary Grądys
Post by Jarosław Sokołowski
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.
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ć \***@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.

Kontynuuj czytanie narkive:
Loading...