
Ich muss eine Reihe von Übungen erstellen, alle mit den gleichen Elementen:
- Titel
- Bild
- Fragen
- Lösungen
- usw..
Ich möchte für jede Übung eine separate Datei erstellen und dann von meinem Hauptdokument aus mehrfach auf diese spezifischen Abschnitte verweisen können. Ich möchte in der Lage sein, Gleichungen, Bilder, Tikz usw. in jedes Element einzufügen.
Ich habe überlegt, für jeden Fall eine Datei mit Makrodefinitionen zu erstellen, zum Beispiel:
ex1.sty
\newcommand\ex1sol{
(contents)
}
...
Rufen Sie dann die Makros bei Bedarf auf, aber das funktioniert nicht, und ich bin der Meinung, dass es sowieso eine bessere Lösung geben muss, da dies keine seltene Anwendung zu sein scheint. Im Wesentlichen bedeutet es, denselben Inhalt in verschiedenen Formaten darzustellen.
Antwort1
Als Variante vonmeine AntwortZuVerwendung von Latex-Codeblöcken als Bibliothek - Zur Wiederverwendung von Latex-Elementen wie Abbildungen in mehreren DarstellungenIch kann eine Schnittstelle anbieten, bei der Dateien mit angebbaren Abschnitten nach Muster
\filesection{⟨name of section⟩}
⟨code⟩
\endfilesection
%-------------------------------------------------------------
\filesection{⟨name of section⟩}
⟨code⟩
\endfilesection
%-------------------------------------------------------------
\filesection{⟨name of section⟩}
⟨code⟩
\endfilesection
%-------------------------------------------------------------
\endinput
Diese Dateien laden Sie mit dem Befehl
\inputfilesection{⟨name of file⟩}{⟨name of section⟩}
Der⟨Code⟩eines Dateiabschnitts wird nur ausgeführt, wenn sowohl der \inputfilesection
-Befehl als auch der \filesection
-comand die gleiche⟨Name des Abschnitts⟩-Streit.
In diesem Fall⟨Code⟩wird unter dem Verbatim-Catcode-Regime gelesen. Anschließend wird das Ergebnis \scantokens
zur erneuten Tokenisierung und normalen Verarbeitung weitergeleitet.
Mehrere \filesection
s können die gleiche⟨Name des Abschnitts⟩In diesem Fall werden alle in der Datei vorkommenden Dateiteile des betreffenden Namens per ausgeliefert \inputfilesection
.
Vorbehalte, die mir bekannt sind:
!!!Nicht \inputfilesection
in Dateien ausführen, die von \inputfilesection
!!! aufgerufen werden.
%
% An example file with \filesection-commands:
%
%\begin{filecontents*}[overwrite]{FileWithSections.tex}
\begin{filecontents*}{FileWithSections.tex}
\filesection{First Section}
Some text in First Section Of FileWithSections.tex.
\begin{verbatim*}
Some verbatim material in
First Section Of FileWithSections.tex.
\end{verbatim*}
\endfilesection
%-------------------------------------------------------------
\filesection{Second Section}
Some text in Second Section Of FileWithSections.tex.
\begin{verbatim*}
Some verbatim material in
Second Section Of FileWithSections.tex.
\end{verbatim*}
\endfilesection
%-------------------------------------------------------------
\filesection{Third Section}
Some text in Third Section Of FileWithSections.tex.
\begin{verbatim*}
Some verbatim material in
Third Section Of FileWithSections.tex.
\end{verbatim*}
\endfilesection
%-------------------------------------------------------------
\endinput
\end{filecontents*}
\documentclass{article}
\usepackage{graphicx}
\makeatletter
%///// start of code that could go into a package / .sty-file//////////////////
\@ifundefined{NewDocumentCommand}{\RequirePackage{xparse}}{}%
\NewDocumentCommand\inputfilesection{mm}{%
\def\@stringincommand{#2}%
\input{#1}%
}%
\newcommand\@stringincommand{}%
\newcommand\@stringinfile{}%
\NewDocumentCommand\filesection{m}{%
\begingroup
\let\do\@makeother\dospecials
\do\^^I%
\do\^^M%
\@filesection{#1}%
}%
\begingroup
\newcommand\@filesection[2]{%
\endgroup
\def\@filesection##1##2#1{%
\def\@stringinfile{##1}%
\expandafter\endgroup
\ifx\@stringinfile\@stringincommand\expandafter\@firstofone\else\expandafter\@gobble\fi
{%
\begingroup
\newlinechar=\endlinechar
\scantokens\expandafter\expandafter\expandafter{%
\expandafter\expandafter\expandafter\endgroup
\UD@RemoveLeadingNTrailingCarriageReturn{##2}#2}%
}\ignorespaces
}%
}%
\@firstofone{%
\let\do\@makeother\dospecials
\catcode`\{=1 %
\catcode`\}=2 %
\@filesection
}{\endfilesection}{\ignorespaces%}%
%=================================================================================
% Begin of code for removing one leading and one trailing explicit
% <carriage-return>-character-token of catcode 12(other) from _verbatimized_
% argument
%=================================================================================
\@ifdefinable\UD@stopromannumeral{\chardef\UD@stopromannumeral=`\^^00}%
%%-----------------------------------------------------------------------------
%% Check whether argument is empty:
%%.............................................................................
%% \UD@CheckWhetherNull{<Argument which is to be checked>}%
%% {<Tokens to be delivered in case that argument
%% which is to be checked is empty>}%
%% {<Tokens to be delivered in case that argument
%% which is to be checked is not empty>}%
%%
%% The gist of this macro comes from Robert R. Schneck's \ifempty-macro:
%% <https://groups.google.com/forum/#!original/comp.text.tex/kuOEIQIrElc/lUg37FmhA74J>
\newcommand\UD@CheckWhetherNull[1]{%
\romannumeral\expandafter\@secondoftwo\string{\expandafter
\@secondoftwo\expandafter{\expandafter{\string#1}\expandafter
\@secondoftwo\string}\expandafter\@firstoftwo\expandafter{\expandafter
\@secondoftwo\string}\expandafter\UD@stopromannumeral\@secondoftwo}{%
\expandafter\UD@stopromannumeral\@firstoftwo}%
}%
%%-----------------------------------------------------------------------------
\begingroup
\@makeother\^^M%
\@firstofone{%
\endgroup%
%%=============================================================================
%% Check whether_verbatimized_ argument has a leading explicit
%% <carriage-return>-character-token of catcode 12(other):
%%-----------------------------------------------------------------------------
%% \UD@CheckWhetherLeadingCarriageReturn{<Argument which is to be checked>}%
%% {<Tokens to be delivered in case
%% <argument which is to be checked>'s
%% 1st token is an explicit <carriage-
%% return>-character-token of
%% catcode 12(other)>}%
%% {<Tokens to be delivered in case
%% <argument which is to be checked>'s
%% 1st token is not an explicit
%% <carriage-return>-character-token of
%% catcode 12(other)>}%
\newcommand\UD@CheckWhetherLeadingCarriageReturn[1]{%
\UD@@CheckWhetherLeadingCarriageReturn\UD@SelDom#1\UD@SelDom^^M\UD@@SelDom%
}%
\@ifdefinable\UD@@CheckWhetherLeadingCarriageReturn{%
\long\def\UD@@CheckWhetherLeadingCarriageReturn#1\UD@SelDom^^M#2\UD@@SelDom{%
\UD@CheckWhetherNull{#2}{\@secondoftwo}{\@firstoftwo}%
}%
}%
%%-----------------------------------------------------------------------------
%% Check whether_verbatimized_ argument having a leading explicit <carriage-
%% return>-character-token of catcode 12(other) consists only of such tokens:
%%-----------------------------------------------------------------------------
%% \UD@CheckWhetherOnlyCarriageReturn{<Argument which is to be checked and
%% which is known to have a leading explicit
%% <carriage-return>-character-token of
%% catcode 12(other)>}%
%% {<Tokens to be delivered in case <argument
%% which is to be checked> consists only
%% of explicit <carriage-return>-character-
%% tokens of catcode 12(other)>}%
%% {<Tokens to be delivered in case <argument
%% which is to be checked> does not consist
%% only of explicit <carriage-return>-
%% character-tokens of catcode 12(other)>}%
\newcommand\UD@CheckWhetherOnlyCarriageReturn[1]{%
\UD@CheckWhetherLeadingCarriageReturn{#1}{%
\expandafter\UD@CheckWhetherOnlyCarriageReturn%
\expandafter{\UD@@TrimLeadingCarriageReturn#1}%
}{%
\UD@CheckWhetherNull{#1}{\@firstoftwo}{\@secondoftwo}%
}%
}%
%%-----------------------------------------------------------------------------
%% Remove one leading explicit <carriage-return>-character-token of
%% catcode 12(other) from _verbatimized_ argument:
%%-----------------------------------------------------------------------------
\@ifdefinable\UD@@TrimLeadingCarriageReturn{%
\long\def\UD@@TrimLeadingCarriageReturn^^M{}%
}%
%%-----------------------------------------------------------------------------
%% Check whether_verbatimized_ argument has a trailing explicit
%% <carriage-return>-character-token of catcode 12(other):
%%-----------------------------------------------------------------------------
%% \UD@CheckWhetherTrailingCarriageReturn{<Argument which is to be checked>}%
%% {<Tokens to be delivered in case
%% <argument which is to be checked>'s
%% last token is an explicit <carriage-
%% return>-character-token of
%% catcode 12(other)>}%
%% {<Tokens to be delivered in case
%% <argument which is to be checked>'s
%% last token is not an explicit
%% <carriage-return>-character-token of
%% catcode 12(other)>}%
\newcommand\UD@CheckWhetherTrailingCarriageReturn[1]{%
\UD@@CheckWhetherTrailingCarriageReturn#1\UD@SelDom^^M\UD@SelDom\UD@@SelDom%
}%
\@ifdefinable\UD@@CheckWhetherTrailingCarriageReturn{%
\long\def\UD@@CheckWhetherTrailingCarriageReturn#1^^M\UD@SelDom#2\UD@@SelDom{%
\UD@CheckWhetherNull{#2}{\@secondoftwo}{\@firstoftwo}%
}%
}%
%%-----------------------------------------------------------------------------
%% Remove one trailing explicit <carriage-return>-character-token of
%% catcode 12(other) from _verbatimized_ argument:
%%-----------------------------------------------------------------------------
\newcommand\UD@TrimTrailingCarriageReturn[1]{%
\UD@@TrimTrailingCarriageReturn#1\UD@SelDom%
}%
\@ifdefinable\UD@@TrimTrailingCarriageReturn{%
\long\def\UD@@TrimTrailingCarriageReturn#1^^M\UD@SelDom{#1}%
}%
%%-----------------------------------------------------------------------------
%% Remove one leading and one trailing explicit <carriage-return>-character-
%% token of catcode 12(other) from _verbatimized_ argument if present.
%% In the edge case of the _verbatimized_ argument consisting only of explicit
%% <carriage-return>-character-tokens of catcode 12(other) remove only one of
%% them.
%% Due to \romannumeral-expansion the result is delivered in 2 expansion-steps:
%%-----------------------------------------------------------------------------
\newcommand\UD@RemoveLeadingNTrailingCarriageReturn[1]{%
\romannumeral%
\UD@CheckWhetherLeadingCarriageReturn{#1}{%
\UD@CheckWhetherTrailingCarriageReturn{#1}{%
\UD@CheckWhetherOnlyCarriageReturn{#1}{%
\expandafter\UD@stopromannumeral\UD@@TrimLeadingCarriageReturn#1%
}{%
\expandafter\expandafter\expandafter\expandafter\expandafter%
\expandafter\expandafter\UD@stopromannumeral\expandafter%
\UD@TrimTrailingCarriageReturn\expandafter{\UD@@TrimLeadingCarriageReturn#1}%
}%
}{%
\expandafter\UD@stopromannumeral\UD@@TrimLeadingCarriageReturn#1%
}%
}{%
\UD@CheckWhetherTrailingCarriageReturn{#1}{%
\expandafter\expandafter\expandafter\UD@stopromannumeral%
\UD@TrimTrailingCarriageReturn{#1}%
}{\UD@stopromannumeral#1}%
}%
}%
}%
%================================================================================
% End of code for removing one leading and one trailing explicit
% <carriage-return>-character-token of catcode 12(other) from _verbatimized_
% argument
%================================================================================
%///// end of code that could go into a package / .sty-file////////////////////
\makeatother
\begin{document}
\noindent
\inputfilesection{FileWithSections.tex}{First Section}
\noindent\hrule\null
\noindent
\inputfilesection{FileWithSections.tex}{Second Section}
\noindent\hrule\null
\noindent
\inputfilesection{FileWithSections.tex}{Third Section}
\noindent\hrule\null
\noindent
\inputfilesection{FileWithSections.tex}{First Section}
\noindent\hrule\null
\noindent
\inputfilesection{FileWithSections.tex}{Second Section}
\noindent\hrule\null
\noindent
\inputfilesection{FileWithSections.tex}{Third Section}
\end{document}