将文档放在末尾,但在开头对其进行评估

将文档放在末尾,但在开头对其进行评估

我想将某些\newcommand命令收集到附录中,这样每个命令都可以有一个部分来解释自己。但是,如果我将此附录放在文件末尾,那么我无法调用文本中间的命令,因为它们尚未定义。

有什么方法可以强制 LaTeX 扫描文件并仅执行其中的命令定义?

答案1

这是一个可以帮助您入门的解决方案。将您的\newcommands 连同描述一起放在 中MyPreamble.sty。此文件的格式为

\newcommand*{\CommandName}{... command text ...}%
\begin{CommandDescription}
    ... the description of what this macro does goes here ...
\end{CommandDescription}

在前言中,您可以\include通过 访问此文件\InputOnlyNewcommands{MyPreamble.sty},它忽略了宏的描述,只定义了\newcommands。在主体中,您可以根据需要使用这些宏。在结尾您可以通过 获得包含这些命令及其描述的附录\InputIgnoringNewcommands{MyPreamble.sty}

在下面的例子中,我定义了三个命令以及它们功能的描述。

在此处输入图片描述

笔记:

  • 不确定如何消除附录中命令名称开头的引号。
  • 包裹filecontents曾是仅有的用于将此示例打包成完全可编译的示例。实际示例中不需要它。
  • 仅有的适用于\newcommand。也就是说,您不能使用\def\renewcommand\providecommand或任何等效宏包裹xparse

代码:

\documentclass{article}
\usepackage{xcolor}
\usepackage{xparse}
\usepackage{enumerate}
\usepackage{environ}

\usepackage{filecontents}
\begin{filecontents*}{MyPreamble.sty}
    \newcommand*{\Bold}[2][black]{\textbf{\textcolor{#1}{#2}}}%
    \begin{CommandDescription}
        This macro makes the text parameter bold.
    \end{CommandDescription}
    
    \newcommand*{\BoldBlue}[1]{\Bold[blue]{#1}}%
    \begin{CommandDescription}
        This macros makes the text parameter bold, and also in blue.
    \end{CommandDescription}
    
    \newcommand*{\BoldRedItalics}[1]{\textit{\Bold[red]{#1}}}%
    \begin{CommandDescription}
        This macros makes the text parameter bold, italicized, and also in red.
    \end{CommandDescription}
\end{filecontents*}

\NewEnviron{CommandDescription}[1]{}{}%

\newcommand{\InputOnlyNewcommands}[1]{%
    \RenewEnviron{CommandDescription}{}{}%
    \input{#1}%
}%

\newcommand{\InputIgnoringNewcommands}[1]{%
    \RenewEnviron{CommandDescription}{%
        \BODY\par
    }{%
    }%
    \RenewDocumentCommand{\newcommand}{%
        s%    #1 = optional star
        m%    #2 = macro name
        O{0}% #3 = number of parameters (optional, defaults to 1)
        o%    #4 = default value of optional parameter
        m%    #5 = code that was to be executed
    }{%
        \medskip\par\noindent%
        \Bold{\string##2:}
    }%
    \input{#1}%
}%


\InputOnlyNewcommands{MyPreamble.sty}

\begin{document}


\section{Body}
Make \Bold{this bold.}

And in color: \BoldBlue{blue.}

And in color with italics: \BoldRedItalics{red.}


\section{Appendix}
\InputIgnoringNewcommands{MyPreamble.sty}

\end{document}

答案2

思考我知道你想要什么。感谢@PeterGrill 和 如何在 LaTeX 文档中显示 LaTeX 代码?现在有效:

% preamble.tex
%
% commands here, documented with comments

% \foo does whatever
\newcommand{\foo}{whatever}

然后

\documentclass{article}
\usepackage{verbatim}

\input{preamble} % define your macros

\begin{document}

\section{Contents}
Use macro \foo{}.

\section{Commands I used} % document your macros

   \verbatiminput{preamble}

\end{document}

您的宏文档将无法使用 LaTeX 格式。Peter Grill 的解决方案可以做到这一点。

编辑:这个问题/答案与奎因斯(看自我复制的 (La)TeX 文档)我用成语\jobname将家​​庭作业问题的来源附加TeX到问题中,以便学生有一个可以开始使用的模板:

% Math 370 hw2
%
\documentclass{article}
\pagestyle{empty}

\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{verbatim}

%% create an environment for theorems
\newtheorem*{thm}{Theorem}

\begin{document}

\begin{thm}
The amount by which the sum of the angles of a spherical triangle
exceeds $\pi$ is proportional to the area of the triangle.
\end{thm}

\verbatiminput{\jobname}

\end{document}

相关内容