编辑

编辑

在编程语言中,您可以定义可以从其他方法或函数调用的方法和函数。这允许软件实现模块化和可读性。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.texquestion2.texquestion3.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.texquestion3.texquestionABX.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}

选择问题

相关内容