在编程语言中,您可以定义可以从其他方法或函数调用的方法和函数。这允许软件实现模块化和可读性。Latex 中是否有类似的结构?
例如,我想使用 Latex 来写我的作业,其中包括问题 1、2、3。
Latex 是否允许我做类似的事情:
main() {
question1
question2
question3
}
question1() {
# Latex code to produce my response to question 1
}
...
除了可读性之外,人们可能还希望这样做,以便他们可以轻松地注释掉文档的某些部分,这样他们不必在每次编译时都看到这么大的文档。
答案1
LaTeX 有宏,宏与函数在很多方面都不同,但可以满足您的目的。需要注意的一点是,文档是从上到下进行评估的,定义按照 Latex 所见的方式进行,因此您必须在调用宏之前先定义宏。例如:
\documentclass{article}
\newcommand\questionone{stuff}
\newcommand\questiontwo{second stuff}
\newcommand\questionthree{third stuff}
\begin{document}
\questionone
\questiontwo
\questionthree
\end{document}
人们为了实现模块化而更常见的做法是将问题放在单独的文件中,例如question1.tex
,question2.tex
和question3.tex
,然后\input
或\include
文件。有一个命令\includeonly
可以限制实际完成的包含,因此以下内容将仅输入question2.tex
:
\documentclass{article}
\includeonly{question2}
\begin{document}
\include{question1}
\include{question2}
\include{question3}
\end{document}
答案2
请参见编辑以下是我真正推荐的……
我不建议这样做,但是如果您想定义所有内容然后\main
在文档中说出来,那么您可以这样做。
\documentclass{article}
\newcommand*\main{%
\begin{enumerate}
\item\questionone
\item\questiontwo
\item\questionthree
\end{enumerate}%
}
\newcommand*\questionone{%
Here is my response to the first question:
The best response ever!%
}
\newcommand*\questiontwo{%
Here is my response to the second question:
The second best response ever!%
}
\newcommand*\questionthree{%
Here is my response to the third question:
The third best response ever!%
}
\begin{document}
\main
\end{document}
正如其他人所说,TeX 使用macros
。LaTeX 3 引入了函数和变量的概念,但它们实际上仍然只是宏。LaTeX 通常(当前版本为 2e)具有命令和环境,但同样,它们都是宏。
编辑
我实际上建议使用不同的方法。正如建议的那样Hood Chatham 的回答,我会将答案放入单独的文件中:,,,question1.tex
等等。然后我会定义一个宏来获取要包含的问题列表question2.tex
question3.tex
questionABX.tex
\main{<comma-separated list of questions>}
例如,
\main{3,ABX}
或者
\main{2,1,3}
管他呢。
以下是使用 LaTeX 3 语法的示例:
\begin{filecontents}{question1.tex}
Here is my response to the first question:
The best response ever!
\end{filecontents}
\begin{filecontents}{question2.tex}
Here is my response to the second question:
The next best response ever!
\end{filecontents}
\begin{filecontents}{question3.tex}
Here is my response to the third question:
The last best response ever!
\end{filecontents}
\begin{filecontents}{questionABX.tex}
Here is my response to another question:
This is another great response!
\end{filecontents}
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\clist_new:N \l_phillip_qlist_clist
\msg_new:nnn { phillip ~ questions } { question file not found } {
phillip ~ questions ~::~question~#1~requested~but~question#1.tex~not~found.~\msg_line_context:.
}
\NewDocumentCommand \main { m }
{
\phillip_print_responses:n { #1 }
}
\cs_new_protected_nopar:Nn \phillip_print_responses:n
{
\clist_set:Nn \l_phillip_qlist_clist { #1 }
\clist_map_inline:Nn \l_phillip_qlist_clist
{
\file_if_exist:nTF { question##1 }
{
\file_input:n { question##1 }
\par
}
{
\msg_fatal:nnn { phillip ~ questions } { question file not found } { ##1 }
}
}
}
\ExplSyntaxOff
\begin{document}
\main{1,2,,3}
\hrule
\main{1,2}
\hrule
\main{3,1}
\hrule
\main{2,ABX}
\end{document}