我正在创建两个文档:一个是作业集,另一个是作业集的解决方案。每个作业集和解决方案集都是一个单独的.tex
文件,作业集手册有一个主文件,答案集手册有.tex
一个主文件。我希望有灵活性,这样我就可以更改作业的顺序,答案文档中也会“自动”完成相同的操作。
我正在使用\include
插入每个作业,现在我有类似
\include{Ass1}
\include{Ass2}
\include{Ass3}
然后在答案中我需要写
\include{Ans1}
\include{Ans2}
\include{Ans3}
有没有办法可以有第三个文件(类似于 make 文件),我可以选择 3、1、2 这样的顺序,然后每个文档(家庭作业和答案)都使用此顺序以“正确”的顺序包含它们的文件,所以我所要做的就是重新编译它们的主.tex
文件?我确实知道如何制作 make 文件(哈哈!)所以也许一个简单易懂的例子会有所帮助。
答案1
此解决方案依赖于作业和答案文件的命名方案。它AssX.tex
按指定顺序获取外部文件,\include
并将该顺序保存到\clist
变量中。
在之后的任何地方,该\getallsolutions
命令都会用(假定的)答案前缀替换作为第一个参数给出的前缀,即然后AssX
变成AnsX
并尝试加载这些文件!
这可以在某些外部文件中进行设置,然后order.tex
输入它,order.tex
而不必每次都更改主文档。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\clist_new:N \g_filename_clist
\NewDocumentCommand{\getallquestions}{m}{%
\clist_gset:Nn \g_filename_clist {#1}
\clist_map_inline:Nn \g_filename_clist {\include{##1}}
}
\NewDocumentCommand{\getallsolutions}{mm}{%
\clist_map_inline:Nn \g_filename_clist {
\tl_set:Nn \l_tmpa_tl {##1}
\tl_replace_once:Nnn \l_tmpa_tl {#1} {#2}
\include{\tl_use:N \l_tmpa_tl}
}
}
\ExplSyntaxOff
\begin{filecontents}{Ass1.tex}
This Ass1
\end{filecontents}
\begin{filecontents}{Ass2.tex}
This Ass2
\end{filecontents}
\begin{filecontents}{Ass3.tex}
This Ass3
\end{filecontents}
\begin{filecontents}{Ans1.tex}
This Ans1
\end{filecontents}
\begin{filecontents}{Ans2.tex}
This Ans2
\end{filecontents}
\begin{filecontents}{Ans3.tex}
This Ans3
\end{filecontents}
\begin{document}
\getallquestions{Ass1, Ass2, Ass3}
\getallsolutions{Ass}{Ans}
Different order:
\getallquestions{Ass3, Ass1, Ass2}
\getallsolutions{Ass}{Ans}
\end{document}
更新——一些改进
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\clist_new:N \g_filename_clist
\NewDocumentCommand{\getallquestions}{m}{%
\clist_gset:Nn \g_filename_clist {#1}
\clist_map_inline:Nn \g_filename_clist {\include{##1}}
}
\NewDocumentCommand{\getallsolutions}{mm}{%
\clist_map_inline:Nn \g_filename_clist {
\tl_set:Nn \l_tmpa_tl {##1}
\tl_replace_once:Nnn \l_tmpa_tl {#1} {#2}
\include{\tl_use:N \l_tmpa_tl}
}
}
\ExplSyntaxOff
\begin{filecontents}{Ass1.tex}
This is Ass1
\end{filecontents}
\begin{filecontents}{Ass2.tex}
This is Ass2
\end{filecontents}
\begin{filecontents}{Ass3.tex}
This is Ass3
\end{filecontents}
\begin{filecontents}{Ans1.tex}
This is Ans1
\end{filecontents}
\begin{filecontents}{Ans2.tex}
This is Ans2
\end{filecontents}
\begin{filecontents}{Ans3.tex}
This is Ans3
\end{filecontents}
\begin{document}
\InputIfFileExists{order}{}{}
\getallsolutions{Ass}{Ans}
Different order:
\InputIfFileExists{differentorder}{}{}
\getallsolutions{Ass}{Ans}
\end{document}
order.tex
\getallquestions{Ass1, Ass2, Ass3}
differentorder.tex
\getallquestions{Ass3, Ass1, Ass2}