Portál AbcLinuxu, 8. května 2025 21:03
přeji pěkný večer,
dostal jse se do situace, kdy bych potřeboval v LaTeXu mít následující funkcionalitu. A nedokážu vymyslet jak NATO...
V externím textovém souboru mám seznam záznamů. Každý záznam má několik položek. Každý záznam je na samostatné řádce. Je možné "získat" jednotlivé položky jako jednotlivá makra? Nevím, jestli se vyjadřuji dostatečně přesně, mělo by to fungovat podobně jako když definuji nová makra, například:
\newcommand{\polozka1}{obsah1}
\newcommand{\polozka2}{obsah2}
akorát s tím rozdílem, že by obsah1, obsah2, ... by byl čten právě z onoho externího souboru. Cyklem bych pak přečetl celý obsah souboru.
V TeXu, jak jsem zjistil, to asi není žádný velký problém. Bohužel, i když se snažím delší dobu "pochopit" filozofické principy TeXu (PlainTeXu) jako takového, to podstatné mi stále uniká, nějak se nemůžu chytit.
Prosím, nevěděl by někdo jak NATO??
Například takto je možné načíst řádky souboru data.txt
:
\newcount\cisradku \cisradku=0 \catcode`\|=13 \let|=\space % Cte radky ukoncene svislitkem, dokud nenarazi na \relax. \def\ctiradky#1|{\advance\cisradku by 1\relax \expandafter\def\csname \the\cisradku!!radek!!\endcsname{#1}% \futurelet\next\ctiradkycont} % Test, je-li dalsi token \relax. \def\ctiradkycont{\ifx\relax\next \let\pokracuj=\relax \else \let\pokracuj=\ctiradky \fi\pokracuj} \endlinechar=`\| % Nacteme soubor s daty a zpracujeme jeho radky. \expandafter\ctiradky \input data.txt \relax \endlinechar=`^^M \catcode`\|=12
Předpokládám, že se v souboru nevyskytují speciální znaky. Výše zmíněný kód nadefinuje makra n!!radek!!
, kde n
je číslo řádku.
Například obsah prvního řádku je přístupný přes \csname 1!!radek!!\endcsname
. Pokud budou na každém řádku dvě položky odděleny středníkem, je možné si napsat makra na načtení první a druhé položky:
\def\prvni#1{\def\nacti##1;##2|{##1}% \expandafter\expandafter\expandafter\nacti\csname #1!!radek!!\endcsname|} \def\druha#1{\def\nacti##1;##2|{##2}% \expandafter\expandafter\expandafter\nacti\csname #1!!radek!!\endcsname|}
Každé z maker dostane číslo řádku a vrátí první resp. druhou položku na řádku. Nakonec ještě stojí za úvahu řádky rozparsovat do položek přímo v makru \ctiradky
.
díky za pomoc,
a omlouvám se za pozdní reakci, byl jsem několi dní mimo své pracovní nástroje...
Byť jsem trošku pokročil ve studiu hlubin TeXu, příp. PlainTeXu, nějak mi uvedený příklad nefunguje. Když si vyrobím textový soubor, třeba
polozka1 polozkovita
polozka2 polozkovita
polozka3 polozkovita
polozka4 polozkovita
tak se mi načte jako jedna řádka. Svislítko jsem na koncích řádek měl, je to jedno, speciální znaky se v textu souboru nevyskytují. Když si nechám zobrazit počítadlo (\the\cisradku), tak opravdu vypíše hodnotu 1.
Příkaz \csname 1!!radek!!\endcsname vypíše celý obsah souboru, příkaz
\csname 2!!radek!!\endcsname
nevypíše nic, předpokládám, že obsah není definován, nebo tak něco.
Zřejmě mi stále něco uniká
To je zvláštní, teď jsem to zkoušel a 4 řádky se mi korektně naparsovaly. Používátě příkaz tex
nebo csplain
?
Ono totiž v latexu je problém v tom, že tam input
není primitiv input
, takže místo input
musíte použít @@input
(tj. uzavřít můj kód mezi \makeatletter
a \makeatother
a \input
přepsat na \@@input
).
Jo, to bude asi ono.
Používám LaTeX, jak jsem psal už v prvním příspěvku (a stále si připadám jako na začátku). Ješte jsem zkoušel PDFLaTeX, chová (chovalo) se to stejně.
Po dopoučených úpravách TO už dělá co je očekáváno.
Do všech tajů TeXu jsem zdaleka ještě nepronikl, přesněji, mám stále silnější pocit, že se (v mém případě) jedná o divergentní proces. No nic, nadechnout a znovu do hluboký vody...
P.S.
Velmi nerad bych se nějak dotknul Petra Olšáka a jeho práce, ale předpokládám, že na zahájení studia TeXu a jeho zákoutí (v kontextu mého prvního dotazu) asi nebude nejvhodnější literatura jeho kniha, TeXbook naruby. Má někdo zkušenost i s jinými knihami ??
BTW,
děkuji mnohokrát za pomoc
Potom zbývá - a pro začátek studia TeXu je vhodnější - jen TeXbook Donalda Knutha, autora TeXu. Nebyl sice přeložen do češtiny, ale to nemusí být velkou překážkou. Je to zároveň vzorný příklad, jak by měla vypadat učebnice. Olšákův TBN si ale nechte poblíž. Ten na to jde skutečně trochu z jiné strany, naruby. Pohoda, hezký den.Velmi nerad bych se nějak dotknul Petra Olšáka a jeho práce, ale předpokládám, že na zahájení studia TeXu a jeho zákoutí (v kontextu mého prvního dotazu) asi nebude nejvhodnější literatura jeho kniha, TeXbook naruby. Má někdo zkušenost i s jinými knihami ??
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.