
was ich grundsätzlich möchte, ist, eine einzelne Liste zu schreiben, z. B. „itemize“, jedes Element mit einem oder mehreren Tags zu versehen und dann eine Ausgabe zu generieren, die basierend auf den Tags mehrere Listen erstellt, d. h. jedes Tag sollte ein Abschnitt oder so etwas sein:
Ich habe bereits gefundenDas:
\documentclass{article}
\usepackage{pgffor}
\usepackage{xstring}
\usepackage{environ}
\usepackage{filecontents}
\begin{filecontents*}{foo.tex}
\begin{pro}{Geometry}
Find the area of ...
\end{pro}
\begin{pro}{Trigonometry}
The angle ...
\end{pro}
\begin{pro}{Algebra}
Prove that $x^2+1=0$ has no real solution.
\end{pro}
\begin{pro}{Geometry}
Find the radius ...
\end{pro}
\end{filecontents*}
\NewEnviron{pro}[1]{%
\IfStrEq{#1}{\CurrentSubject}{\item \BODY}{}
}%
\newcommand*{\CurrentSubject}{}%
\begin{document}
\foreach \Title in {Algebra, Geometry, Trigonometry} {%
\renewcommand*{\CurrentSubject}{\Title}%
\section*{\CurrentSubject}
\begin{enumerate}
\input{foo}
\end{enumerate}
}%
\end{document}
Dies erscheint jedoch nicht angemessen, da pro Artikel nur ein Tag verwendet werden kann.
Gibt es etwas, das dies tut? Ich habe bereits darüber nachgedacht, mein eigenes Paket zu implementieren, kenne mich aber mit der Tex-Programmierung nicht aus.
Aktualisieren
Ich habe eine Möglichkeit gefunden, den geposteten Code zu ändern, um eine Sortierung nach mehreren Tags zu erreichen:
\documentclass{article}
\usepackage{pgffor}
\usepackage{xstring}
\usepackage{environ}
\usepackage{filecontents}
\begin{filecontents*}{foo.tex}
\begin{pro}{Geometry}{}{}{}{}
Find the area of ...
\end{pro}
\begin{pro}{Trigonometry}{}{}{}{}
The angle ...
\end{pro}
\begin{pro}{Algebra}{Trigonometry}{}{}{}
Prove that $x^2+1=0$ has no real solution.
\end{pro}
\begin{pro}{Geometry}{Algebra}{}{}{}
Find the radius ...
\end{pro}
\end{filecontents*}
\NewEnviron{pro}[5]{%
\IfStrEq{#1}{\CurrentSubject}{\item \BODY}{}
\IfStrEq{#2}{\CurrentSubject}{\item \BODY}{}
\IfStrEq{#3}{\CurrentSubject}{\item \BODY}{}
\IfStrEq{#4}{\CurrentSubject}{\item \BODY}{}
\IfStrEq{#5}{\CurrentSubject}{\item \BODY}{}
}%
\newcommand*{\CurrentSubject}{}%
\begin{document}
\foreach \Title in {Algebra, Geometry, Trigonometry} {%
\renewcommand*{\CurrentSubject}{\Title}%
\section*{\CurrentSubject}
\begin{enumerate}
\input{foo}
\end{enumerate}
}%
\end{document}
Geben Sie also im Voraus eine Anzahl von Tags an, die Sie verwenden möchten. Das funktioniert, ist aber unpraktisch – es wäre toll, wenn jemand wüsste, wie man das dynamisch gestalten kann.
Wenn jemand es verwenden oder beitragen möchte:https://github.com/maalaria/kite
Antwort1
Das folgende Beispiel stellt die pro
Umgebung bereit, um ein einzelnes obligatorisches Argument anzunehmen, das eine durch Kommas getrennte Liste von Tags enthalten kann. Für jedes Tag \BODY
wird die Umgebung in einem Makro gespeichert <tag>@<num>
, das dann der Reihe nach über gedruckt werden kann \printlist{<tag>}
.
\documentclass{article}
\usepackage{pgffor,environ}
\usepackage{filecontents}
\begin{filecontents*}{foo.tex}
\begin{pro}{Geometry}
Find the area of \ldots
\end{pro}
\begin{pro}{Trigonometry}
The angle \ldots
\end{pro}
\begin{pro}{Algebra,Trigonometry}
Prove that $x^2 + 1 = 0$ has no real solution.
\end{pro}
\begin{pro}{Geometry,Algebra}
Find the radius \ldots
\end{pro}
\end{filecontents*}
\makeatletter
\NewEnviron{pro}[1]{%
\foreach \Title in {#1} {%
\expandafter\ifcsname c@\Title\endcsname\else% If a counter doesn't exist...
\newcounter{\Title}% ... create it
\fi
\stepcounter{\Title}% Another element should be added to particular list
\edef\x{% Add element to particular list
\noexpand\expandafter\noexpand\protected@xdef
\noexpand\csname \Title @\csname the\Title\endcsname\noexpand\endcsname{\BODY}}\x
}
}
\makeatother
\newcommand{\processfile}[1]{\input{#1}}
\newcommand{\printlist}[2][itemize]{%
\expandafter\let\expandafter\listend\csname the#2\endcsname
\begin{#1}
\foreach \curitem in {1,...,\listend} {
\item \expandafter\csname #2@\curitem\endcsname
}
\end{#1}
}
\begin{document}
\processfile{foo}% Process file with pro environments
Algebra:
\printlist{Algebra}
Geometry:
\printlist{Geometry}
Trigonometry:
\printlist{Trigonometry}
\end{document}
Die Bearbeitung der Datei erfolgt mittels \processfile{<file>}
.
Es wird keine Fehlerprüfung durchgeführt, um festzustellen, ob <tag>
bei einem Aufruf von vorhanden ist \processlist{<tag>}
, aber hinzugefügt werden könnte.