我想将某些\newcommand
命令收集到附录中,这样每个命令都可以有一个部分来解释自己。但是,如果我将此附录放在文件末尾,那么我无法调用文本中间的命令,因为它们尚未定义。
有什么方法可以强制 LaTeX 扫描文件并仅执行其中的命令定义?
答案1
这是一个可以帮助您入门的解决方案。将您的\newcommand
s 连同描述一起放在 中MyPreamble.sty
。此文件的格式为
\newcommand*{\CommandName}{... command text ...}%
\begin{CommandDescription}
... the description of what this macro does goes here ...
\end{CommandDescription}
在前言中,您可以\include
通过 访问此文件\InputOnlyNewcommands{MyPreamble.sty}
,它忽略了宏的描述,只定义了\newcommand
s。在主体中,您可以根据需要使用这些宏。在结尾您可以通过 获得包含这些命令及其描述的附录\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}