Hallo in die Runde,
in meinen Augen wäre es ein tolles Feature, wenn man mehrere, fortlaufende Karten (wie A1 ... A5) nicht einzeln anlegen müsste, sondern einfach als eine Karte schreibt und dann daraus beim Kompilieren einzelne Karten gemacht werden.
Also, man schreibt:
- Code: Alles auswählen
\begin{legendcard}{letterbox}{A}
\addmaintext{
...
}
\end{legendcard}
... und daraus werden dann einzelne Karten für A1, A2, ... erstellt, wenn nicht alles auf eine Karte passt.
Dass das Aufteilen "von alleine" passiert, ist vermutlich schwer umzusetzen -- aber mich würde @UhrMenschs Meinung dazu interessieren, immerhin kannst du ja bei \addmaintext* auch irgendwie feststellen, ob der Text auf die Karte passt oder nicht --; eine Lösung, die aber zumindest in diese Richtung geht, ist ein Befehl, nennen wir ihn \cardbreak, mit dem man Legendenkarten umbrechen kann:
- Code: Alles auswählen
\begin{legendcard}{letterbox}{A}
\addmaintext{
...
\cardbreak
...
}
\end{legendcard}
... würde also werden zu:
- Code: Alles auswählen
\begin{legendcard}{letterbox}{A1}
\addmaintext{
...
\autocontinueat{A2}
}
\end{legendcard}
\begin{legendcard}{letterbox}{A2}
\addmaintext{
...
}
\end{legendcard}
..., ohne dass man die legendcard-Umgebung jedes Mal neu anlegen muss.
Ich habe das mal implementiert. Mit diesem Code funktioniert der Befehl \cardbreak wie oben beschrieben:
- Code: Alles auswählen
\let\oldlegendcard\legendcard
\let\endoldlegendcard\endlegendcard
\let\oldaddmaintext\addmaintext
\ExplSyntaxOn
\NewDocumentEnvironment{newlegendcard}{m m o o +b}{
\tl_set:Nn \g_legendcard_paramA_tl {#1}
\tl_set:Nn \g_legendcard_paramB_tl {#2}
\tl_set:Nn \g_legendcard_paramC_tl {#3}
\tl_set:Nn \g_legendcard_paramD_tl {\IfNoValueTF{#4}{#2}{\tl_if_blank:nTF {#4} {#2} {#4}}}
\tl_set:Nn \l_legendcard_body_tl {#5}
\seq_set_split:NnV \l_legendcard_body_seq {\addmaintext} \l_legendcard_body_tl
\seq_pop_left:NN \l_legendcard_body_seq \g_legendcard_info_tl
\seq_map_inline:Nn \l_legendcard_body_seq {\addmaintext{##1}}
}{}
\NewDocumentCommand{\newaddmaintext}{+m}{
\tl_set:Nn \l_legendcard_maintext_tl {#1}
\regex_replace_all:nnN {(\c{end}\{bulletlist\}[\s\S]*?)\c{cardbreak}([\s\S]*?\c{begin}\{bulletlist\})} {\1\c{xxxcardbreakxxx}\2} \l_legendcard_maintext_tl
\regex_replace_all:nnN {(\c{begin}\{bulletlist\}[\s\S]*?)\c{cardbreak}([\s\S]*?\c{end}\{bulletlist\})} {\1\c{end}\{bulletlist\}\c{vspace}\{-\c{parskip}\}\c{xxxcardbreakxxx}\c{begin}\{bulletlist\}\2} \l_legendcard_maintext_tl
\regex_replace_all:nnN {(\c{begin}\{bulletlist\}[\s\S]*?)\c{cardbreak}([\s\S]*?\c{end}\{bulletlist\})} {\1\c{end}\{bulletlist\}\c{vspace}\{-\c{parskip}\}\c{xxxcardbreakxxx}\c{begin}\{bulletlist\}\2} \l_legendcard_maintext_tl
\regex_replace_all:nnN {\c{xxxcardbreakxxx}} {\c{cardbreak}} \l_legendcard_maintext_tl
\seq_set_split:NnV \l_legendcard_maintext_seq {\cardbreak} \l_legendcard_maintext_tl
\int_new:N \l_legendcard_index_int
\int_zero:N \l_legendcard_index_int
\int_new:N \l_legendcard_maintext_int
\int_set:Nn \l_legendcard_maintext_int {\seq_count:N \l_legendcard_maintext_seq}
\seq_map_inline:Nn \l_legendcard_maintext_seq {
\int_incr:N \l_legendcard_index_int
\tl_clear:N \l_legendcard_title_tl
\tl_put_right:Nx \l_legendcard_title_tl {\tl_use:N \g_legendcard_paramB_tl}
\int_compare:nNnT {\l_legendcard_maintext_int} > {1} {
\tl_if_eq:VnTF \g_legendcard_paramA_tl {letterbox}
{\tl_put_right:Nx \l_legendcard_title_tl {\int_use:N \l_legendcard_index_int}}
{\tl_put_right:Nx \l_legendcard_title_tl {~\int_use:N \l_legendcard_index_int}}
}
\begin{oldlegendcard}{\tl_use:N \g_legendcard_paramA_tl}{\tl_use:N \l_legendcard_title_tl}[\tl_use:N \g_legendcard_paramC_tl][\tl_use:N \g_legendcard_paramD_tl]
\tl_use:N \g_legendcard_info_tl
\oldaddmaintext{
##1
\int_compare:nNnT {\l_legendcard_maintext_int} > {\l_legendcard_index_int} {
\tl_clear:N \l_legendcard_title_next_tl
\tl_put_right:Nx \l_legendcard_title_next_tl {\tl_use:N \g_legendcard_paramB_tl}
\tl_if_eq:VnTF \g_legendcard_paramA_tl {letterbox}
{\tl_put_right:Nx \l_legendcard_title_next_tl {\int_eval:n {\l_legendcard_index_int + 1}}}
{\tl_put_right:Nx \l_legendcard_title_next_tl {~\int_eval:n {\l_legendcard_index_int + 1}}}
\autocontinueat{\tl_use:N \l_legendcard_title_next_tl}
}
}
\end{oldlegendcard}
\renewcommand{\addcardlistbox}[1]{}
}
}
\ExplSyntaxOff
\let\legendcard\newlegendcard
\let\endlegendcard\endnewlegendcard
\let\addmaintext\newaddmaintext
Hinweis: Man kann Code auch in separaten Dateien auslagern und dann mit \input{...} importieren. So "müllt" man nicht seine ganze Hauptdatei zu.
Was passiert:Der obige Code definiert die legendcard-Umgebung und den Befehl \addmaintext um. Die sehen also noch aus wie die alten, funktionieren aber intern anders. Das sollte man im Hinterkopf haben, falls man mal auf Fehlersuche gehen muss.
Was funktioniert:- Zahlen werden automatisch nach dem Kartennamen eingefügt, falls es sich um mehr als eine fortlaufende Karte handelt.
- \autocontinueat{} wird automatisch eingefügt (außer bei der letzten Karte)
- Mit \autocardref{}, \autocontinueat{} etc. kann man auf den Namen ohne Zahl referenzieren (z. B. \autocardref{A}) und es wird dann auf die erste Karte verlinkt (z. B. A1).
- Man kann \cardbreak auch innerhalb einer bulletlist-Umgebung verwenden (die wird dann automatisch geschlossen und auf der nächsten Karte wieder geöffnet), aber nicht in anderen Umgebungen oder in verschachtelten Strukturen
Was nicht funktioniert:- \addmaintext muss jetzt der letzte Befehl innerhalb einer legendcard-Umgebung sein (hat man vorher zwar auch in der Regel so gemacht, war da aber nicht verpflichtend so)
- \addmaintext* funktioniert nicht mehr richtig
- \autocardlisttext funktioniert nicht mehr richtig; da muss ich noch rausfinden, wieso
Ich werde da in Zukunft wohl noch ein bisschen weiter dran rumbasteln. Zur Zeit bearbeite ich eine Legende damit und es geht wirklich um einiges schneller als vorher. Würde mich aber auch freuen, wenn @UhrMensch etwas in der Art direkt in seinen Code einbaut.

LG Mivo