LaTeX: tárgymutatóba kerülő szócsoport első megjelenítése az írott anyagban

Fórumok

Sziasztok.

Egy izgalmas dologban kérek most tanácsot.

Adott egy nagyon hosszú, írott anyag, legyen a neve ennek mondjuk az, hogy book.
Ezzel az osztályt is megadtam.

Lesznek ebben szakkifejezések, melyek a folyamatos átírások, bővítések alatt sok helyen meg is jelennek. Azt szeretném, ha valaki lineárisan olvassa majd a kész anyagot, mindig az első szakkifejezés megjelenésekor nem footnote-ként, hanem mondjuk egy \ablak{} makróval integrálódjon be a szövegtükörbe egy kis 3x5 cm-es boxba (itt csak mondtam 2 számot ezzel). Szóval az új fogalom, mint egy szövegbe beúsztatott kép, jelenjen meg keretbe (ovalbox) foglalva.

A kérdésem az, van-e ilyesmire már létező makro, vagy nekem kell majd írnom egyet hozzá?
Egyelőre elképzelésem sincs hogyan írjak ehhez ilyesmit, talán mielőtt legenerálnám a tárgymutatót, tartalomjegyzéket, akkor egy scriptet szabadítok rá a szövegre, ami a megfelelő helyre beilleszti a külön .tex vagy .txt fájlban letárolt definíciókat. De ez csak egy ötlet.

Hozzászólások

lusta vagyok kipróbálni, szerintem LaTeX-ben egy counter használatával, a counter értékét vizsgáló if-fel és két eltérő szöveggel
a counter = 0, illetve a counter > 0 értékhez működne.

Legföljebb az a kérdés, hány ilyen képlet van, hány counter kell:

"... TEX has 256 registers called \count0 to \count255"

Ha ez nem megy, minden képlet első beillesztésekor lehetne egy új, hozzá kapcsolt makrót definiálni, s a képlet következő előfordulási helyein azt nézni, hogy definiálva van-e ez a makró.

Persze az is lehet, hogy mégsem a (La)TeX forráson belül ideális ilyesmit megoldani :-)

Mindegy, hogy képlet vagy fogalom, lábjegyzetbe vagy szójegyzékbe vagy hova megy, a második változatnál (lásd lentebb) a

\ifdefined#2

ellenőrzi, hogy első előfordulás-e, s ennek megfelelően lehet a 2 ágba különböző dolgokat írni.

Gond talán azzal lehet, hogy ha MINDEN, a Glossary-ba szánt fogalom így kerül be a könyv forrásszövegébe, túl sok általunk definiált makró lesz (ti. mindegyik fogalomhoz egy).

De másként nehezen tudom elképzelni, hogy a LaTeX automatikusan föl tudná ismerni, hogy melyik az első előfordulás (ha pl. törlünk szövegrészeket, megcserélünk fejezeteket, stb.)

Lehet hogy fáradt vagyok már, de nem világos, hogy mit szeretnél.
- Alaphelyzetben a footnote a lap alján jelenik meg, és

\footnote{…}

-tal szúrod be.
- A tárgymutató általában a könyv végén van. Illetve azon a részén, ahova a

\printindex

-szel beszúrod, és az

\index{…}

bejegyzéseket tartalmazza.

Én is fáradt vagyok, de leírom még egyszer. Másképp fogalmazva.

A \footnote{} a lap alján van, azokat csak az egyszeri, tárgymutatóba be nem kerülő szavaknál használom.

a tárgymutatóba ami bekerül, szeretném a legelső könyvbeli előforduláskor úgy megjeleníteni, mint egy html oldalon beúszó képet. Kis keretben leírnám a fogalom lényegét, és ennyi az egész ovalbox-ba foglalva.

Az, hogy a tárgymutató, a névjegyzék és a tartalomjegyzék hova kerül, már más tészta, de az oldalszámok miatt ezeket mindig kétszer kell legenerálni.

Mivel a latex a printindex beszúrási helyénél dolgozza fel az indexeket, így első közelítésben úgy gondolom, hogy magát az index parancsot kellene alaposan átírnod, kibővítve az általad kívánt funkcióval. Hogy ez egyáltalán lehetséges-e, arról fogalmam sincs. Annyira nem ismerem a latex/tex belső világát.

Nem az amit szeretnél, de részben valami hasonló érhető el a

\marginpar és a \marginnote

parancsokkal. Nem szövegdobozban lesz, hanem a margó részen. Funkciójában hasonló lesz, csak nem lesz boxban. Viszont ez nem fog bekerülni a tárgymutatóba. (Kezdésnek: https://www.sharelatex.com/learn/Margin_notes)

Amit javaslok: Írsz egy saját marginnote (vagy marginpar) parancsot, ami egyszer a paraméterét átadja az eredeti parancsnak, illetve egy index parancsnak is. Valami ilyesmire gondolok:


\usepackage{marginnote}
\newcommand{\mymarginnote}[1]{
   \index{#1}
   \marginnote{#1}
}

Az ovalboxszal az a baj, hogy az abban elhelyezett szöveget nem fogja tördelni, hanem egy sor lesz belőle. Ez igaz minden olyan *boxra, ami nem egy teljes bekezdést kezel. Illetve, ha *boxon belül egy \parbox{}-ba teszed, akkor tördelni fogja, de akkor külön bekezdés lesz. A minipage környezettel lehetne próbálkozni, de szerintem azt sem lehet körbefolyatni másik szöveggel.

Tudomásom szerint körbefolyatni csak képet és táblázatot lehet. Bár a táblázattal lehet egy kicsit gányolni, de az eredmény nem teljesen az lesz, amit te akarsz, mert nem a beszúrás helyén lesz a körbefolyatott szöveg, hanem egy következő bekezdésben. Szerintem a \marginnote sokkal jobb, de ez ízlés kérdése.

Kezdésnek:


\newcommand{\myindex}[2]{
  \index{#1}
  \begin{wraptable}{l}{0.5\textwidth}
    \begin{tabular}{|p{0.45\textwidth}|}
      \hline
      #2 \\ \hline
    \end{tabular}
  \end{wraptable}
}

%Csúnya és bonyolult, a számozás is béna, de talán ezzel el lehet indulni:
%%%
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[magyar]{babel}
\usepackage[T1]{fontenc}
\title{Próbaszöveg}
\newcommand{\kbeszur}[2]{%
\ifdefined#2#1, lásd (\footnote{Magyarázat: #1})%
\else%
#1\marginpar{\framebox[1.4in]{\small Első #1}}\newcommand{#2}{}%
\fi%
}
\begin{document}
\maketitle
Itt az első képlet: \kbeszur{$a^2+b^2=c^2$}{\elsokeplet}, ami a Pitagorász tétel blabla blabla blabla blabla blabla blabla.

Ez meg a négyzetes összefüggés:
\kbeszur{$\sin^2\alpha + \cos^2\alpha = 1$}{\masodikkeplet} blabla blabla blabla blabla blabla blabla.

Persze ha újra betesszük, már lábjegyzetben lesz:
\kbeszur{$a^2+b^2=c^2$}{\elsokeplet} blabla blabla blabla blabla blabla.

Ebben a paragrafusban újra előfordul a második képlet:
\kbeszur{$\sin^2\alpha + \cos^2\alpha = 1$}{\masodikkeplet}.
\vfill\pagebreak[4]
És még egyszer az első formula: \kbeszur{$a^2+b^2=c^2$}{\elsokeplet}.
\end{document}
%%%

Azt hiszem alkottam valamit, bár ez is bonyolult.
A wrapfig-ben találtam egy képkörbefuttatást, de ez esetben le kell mondanom az ábrák jegyzékéről a végén...
Kísérleteim addig jutottak, hogy már a szövegtükör belsejében van amit akartam, egyelőre keret nélkül, "első előfordulás" figyelése még nincs benne.
Attól tarok, a kész kód olyan durva lesz, hogy a hajamat befonom tőle, így még kutatok, hátha tényleg van kész megoldás.

Íme, amit összehoztam, bocs a sok Loremispumért, kellett sajnos:


%Csúnya és bonyolult, a számozás is béna, de talán ezzel el lehet indulni:
%%%
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[magyar]{babel}
\usepackage[T1]{fontenc}
\usepackage{wrapfig}
\title{Próbaszöveg}


\newcommand{\mymarginnote}[2]{
   \index{#1}
 \begin{wrapfigure}{r}{0.4\textwidth}
  \vspace{10pt}
   \begin{center}
   \vspace{5pt}
    \begin{flushleft}
    #2
    \end{flushleft}
   \vspace{5pt}
   \end{center}
  \vspace{10pt}
 \end{wrapfigure}
}


\begin{document}
\maketitle
Itt az első loremipsum képlet:, ami a Pitagorász tétel blabla blabla blabla blabla blabla blabla.

Most jön a tesztmondat::
Ez a mondat eleje, amiben a ,,tipográfiai hulladék'' szerepel, mint különlegesen 
meghatározandó fogalom, de csak akkor jön ki szépen a külalak, ha a makrót a 
mondatvégi pont után szúrom be, esetleg a mondat előtt.a mondat vége akar itt lenni.
\mymarginnote{Tipográfiai hulladék}{Ez megy a margóra, 
mert sok ott a hely, meg nagyon szeretem agyonvágni az oldalkinézetet tipográfiai 
szeméttel. Lorem ipsum ergo sum\dots}

LOREM IPSUM:

There is a boot option for the built-in aoe driver and a
  corresponding module parameter, aoeiflist.  Without this option,
  all network interfaces may be used for ATA over Ethernet.  Here is a
  usage example for the module parameter.

  The aoedeadsecs module parameter determines the maximum number of
  seconds that the driver will wait for an AoE device to provide a
  response to an AoE command.  After aoedeadsecs seconds have
  elapsed, the AoE device will be marked as "down".  A value of zero
  is supported for testing purposes and makes the aoe driver keep
  trying AoE commands forever.

  The aoemaxout module parameter has a default of 128.  This is the
  maximum number of unresponded packets that will be sent to an AoE
  target at one time.

  The aoedyndevs module parameter defaults to 1, meaning that the
  driver will assign a block device minor number to a discovered AoE
  target based on the order of its discovery.  With dynamic minor
  device numbers in use, a greater range of AoE shelf and slot
  addresses can be supported.  Users with udev will never have to
  think about minor numbers.  Using aoedyndevs=0 allows device nodes
  to be pre-created using a static minor-number scheme with the
  aoe-mkshelf script in the aoetools.

  The aoemaxout module parameter has a default of 128.  This is the
  maximum number of unresponded packets that will be sent to an AoE
  target at one time. Most ismét jön egy tesztmondat.\mymarginnote{Tipográfiai hulladék}{Ez megy a margóra, 
mert sok ott a hely, meg nagyon szeretem agyonvágni az oldalkinézetet tipográfiai 
szeméttel. Lorem ipsum ergo sum\dots}


  The aoedyndevs module parameter defaults to 1, meaning that the
  driver will assign a block device minor number to a discovered AoE
  target based on the order of its discovery.  With dynamic minor
  device numbers in use, a greater range of AoE shelf and slot
  addresses can be supported.  Users with udev will never have to
  think about minor numbers.  Using aoedyndevs=0 allows device nodes
  to be pre-created using a static minor-number scheme with the
  aoe-mkshelf script in the aoetools.

  The aoemaxout module parameter has a default of 128.  This is the
  maximum number of unresponded packets that will be sent to an AoE
  target at one time.

  The aoedyndevs module parameter defaults to 1, meaning that the
  driver will assign a block device minor number to a discovered AoE
  target based on the order of its discovery.  With dynamic minor
  device numbers in use, a greater range of AoE shelf and slot
  addresses can be supported.  Users with udev will never have to
  think about minor numbers.  Using aoedyndevs=0 allows device nodes
  to be pre-created using a static minor-number scheme with the
  aoe-mkshelf script in the aoetools.

\listoffigures


\end{document}

Csak halkan megjegyzem, hogy az utolsó példám majdnem ugyanezt csinálja, csak balra rakja a magyarázatot, illetve be is van keretezve. Továbbá az ábrák jegyzékéről sem kell lemondanod. Helyette a táblázatok jegyzékéről kell lemondanod. :-)

A balra vagy jobbra rendezés a wraptable első paraméterétől függ.

Apró megjegyzés: a mymarginnote ebben az esetben elég megtévesztő megnevezés, mert már semmi köze nincs a margóhoz. Inkább myindex, vagy valami hasonló.

Ezt az első előfordulás figyelését még mindig nem nagyon értem:

- Az első előfordulásnál beírod, hogy \myindex{indexbe}{hosszú szöveg a dobozba}. A második/harmadik/… előfordulásnál pedig az \index{indexbe} parancsot használod. Ehhez fejben/papíron/elektronikus jegyzetben nyilván kell tartani az első előfordulást, de keveset kell gépelni.

- Ha sikerül automatikusan figyelni az első előfordulást, akkor az azért jó, mert ha később beszúrsz az eddig első elé egy újabbat, akkor ezt automatikusan észre fogja venni a következő fordításkor, és a másodiknál nem jelenik meg a magyarázó szöveg. Ez jó. Csak az a baj, hogy ehhez mindig mind a két szöveget be kell írni. Tehát nyersz egy kis kényelmet, de ehhez sokkal többet kell gépelned. Ugyanis ha már harmadszor fordul elő, akkor is be kell gépelni a teljes magyarázatot, mert ha előtte levő előfordulásokat később törlöd, akkor pl. a mostani 3. előfordulásból első lesz.

Nem ertek LaTeX-hez, de olvasva a problemat es a hozzaszolasokat az jutott eszembe, hogy ha LaTeX-ben ezt nehez, akkor miert nem futtatod at a szovegedet egy elofeldolgozo scripten, mielott a LaTeX-nek odaadnad, hogy formazza meg.

A script-nek beadhatnad kulon a szojegyzeket, minden szonak megkeresne az elso elofordulasat es odatenne egy LaTeX kod valtozatot (lebego magyarazat), a tobbi helyre meg csak akarmi jelet, hogy lasd szoszedet.

Megvan, működik!

csináltam egy könyvtárat, melyben minden szó kapott egy plaintext fájlt, pl:
boci.tex
Ebben csak egy bekezdés szerepel, a tulajdonképpeni szöveg.

A makrófájlomban csináltam egy ilyet:


% fogalom meghatarozasa ugy, hogy az elsonel magyarazat legyen
\newcommand{\fog}[2]{%
\ifdefined#2#1%
\else%
\begin{wrapfigure}{r}{0.5\textwidth} 
    \begin{tabular}{|p{0.46\textwidth}|}
      \hline
      \\
   \vbox{\input{/home/a/Desktop/Asztal/konyv/1/fogalmak/#1.tex}}
      \\
      \hline
    \end{tabular}
\end{wrapfigure}\newcommand{#2}{}%
\fi%
}

A fődoksiban leírtam a mondatot:

Amikor a vitorlás leeresztette a bociját\fog{boci}{\boci} hogy egy hibbantat kirakjon a partra\dots

Ezután minden mondatban a boci előfordulásakor alkalmaztam a \fog{}{} cuccost, ezután a latexfordító a legelső előforduláskor megcsinálta szövegtörzsön belül a boxot, ahogy akartam. Persze a wrapfigure esetében ki kell lőni a képek jegyzékéből is az alapfogalmak hekkjét, de ez más téma.

Szerintetek lehet ezt a borzalmas kódot szebbíteni?

talán erre külön írok egy kis makrót, hogy ha a szövegben előfordul ragozva vagy ragozatlanul a ,,boci'' szó, csak ennyit kelljen csinálni:

%
bocival\fogalom{boci} szoktak kimenni a partra\dots
%

Így a többi szakkifejezésnél sem lesz fárasztóbb a dolog, mint mondjuk leírni, hogy \footnote