例如,我写了一个包含大量问题的练习册。我不想使用数据库。在输入文件中,我这样写。
\pro{geometry}
Find the area of ...
\endpro
\pro{trigonometry}
The angle ...
\endpro
\pro{algebra}
Prove that $x^2+1=0$ has no real solution.
\endpro
\pro{geometry}
Find the radius ...
\endpro
但在 PDF 中渲染输出时,问题会根据标签分组。例如,
代数:
- 证明 $x^2+1=0$ 没有实数解。
几何学:
- 求...的面积
- 找到半径...
三角学:
- 角度...
答案1
这不是根据标签“排序”,但确实实现了预期的结果。
问题放在外部文件中,每个主题输入一次,并且只打印与当前主题匹配的环境。
笔记:
- 每个主题必须至少有一个问题。
- 为了简化事情,我将标题和主题设置为相同,但此代码可以轻松适应以下情况,例如主题为
trig
,标题为Trigonometry
。
代码:
\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}
答案2
您可以在各种令牌寄存器中积累练习:
\documentclass{article}
\usepackage{environ}
\makeatletter
\newcommand{\check@pro}[1]{%
\@ifundefined{pro@#1}{\create@pro{#1}}{}%
}
\newcommand\create@pro[1]{%
\expandafter\newtoks\csname pro@#1\endcsname
}
\NewEnviron{pro}[1]{%
\check@pro{#1}%
\global\csname pro@#1\endcsname=\expandafter{\the\csname pro@#1\expandafter\endcsname
\expandafter\item\BODY}%
}
\makeatother
\newcommand{\printpro}[1]{%
\section*{#1}
\begin{enumerate}
\the\csname pro@#1\endcsname
\end{enumerate}
}
\begin{document}
\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}
\printpro{Algebra}
\printpro{Geometry}
\printpro{Trigonometry}
\end{document}
答案3
以下答案对于您的实际用例来说可能太晚了,但也许其他人会感兴趣。
这exsheets
包可以在这里使用。不过语法会略有不同。包允许您为问题分配主题,然后您可以选择要使用哪个主题。
\SetupExSheets{use-topics=<some topic>}
\begin{question}[topic=<some topic>]
Some question...
\end{question}
\begin{question}[topic=<some other topic>]
Some other question...
\end{question}
这里仅排版第一个问题。
当问题被放在单独的文件中时,这可以用来实现所需的结果。虽然练习不会被排序,但会按照文件中给出的顺序包含在内。
exsheets
有一个命令\includequestions
,它包含来自外部文件的问题/练习,但在下面的例子中,这并不是必需的——一个简单的\include
就足够了。对于未编号的章节标题,需要question
手动重置计数器。无论如何,都可以轻松定义一些包装器宏来创建标题,可能重置计数器,并根据主题包含问题。
\documentclass{scrartcl}
\usepackage[load-headings]{exsheets}
\SetupExSheets{
% only place a number in front of the exercises instead of creating a title:
headings=runin-nr,
% default headings would be bold, so:
headings-format=,
% reset `question' counter with a new section:
counter-within=section
}
% the external file:
\usepackage{filecontents}
\begin{filecontents}{\jobname-exercises.tex}
\begin{question}[topic=geometry]
Find the area of ...
\end{question}
\begin{question}[topic=trigonometry]
The angle ...
\end{question}
\begin{question}[topic=algebra]
Prove that $x^2+1=0$ has no real solution.
\end{question}
\begin{question}[topic=geometry]
Find the radius ...
\end{question}
\end{filecontents}
\begin{document}
\section{Algebra}
\SetupExSheets{use-topics=algebra}
\includequestions{\jobname-exercises}
\section{Geometry}
\SetupExSheets{use-topics=geometry}
\includequestions{\jobname-exercises}
\section{Trigonometry}
\SetupExSheets{use-topics=trigonometry}
\includequestions{\jobname-exercises}
\end{document}
将解决方案添加到练习中并在之后将其打印在不同的部分中相对容易(在这种情况下,不太模糊的问题编号会更有利)。