是否可以定义一组宏,将它们包含在 LaTeX 源文件中
main.tex
,然后在发布后
$ latex main.tex
main.tex
在文件中找到的序言,比如说main.nem
?
要求是,main.tex
我不必触碰源代码。因此,我收到一个文件main.tex
,该文件已经包含我在这个问题中要求的魔法宏。我所要做的就是编译该文件并将序言放在文件中。作者的负担main.tex
不应大于包含包含魔法宏的文件。不允许要求作者使用特殊的文档类,也不允许必须编写
\begin{filecontents}...
或类似的东西。我使用他的文件的唯一痕迹是
\input{magic_macros.tex}
在他的序言中某处。
我可以用我定义的宏来做一些类似的事情,这在我的应用领域中被证明是非常有用的。
一个简化的例子是:
macros.tex
:
\newwrite\nemWrite
\immediate\openout\nemWrite=\jobname.nem
\newtoks\nemToks
\newcommand{\toNem}[1]{%
\nemToks={#1}
\immediate\write\nemWrite{\the\nemToks}
}
\newcommand{\question}[1]{%
\toNem{#1}%
{#1}%
}
main.tex
:
\documentclass{article}
\input{macros.tex}
\begin{document}
\question{%
What does $2+2$ evaluates to?
}
我希望序言中也存在类似的内容。
答案1
您可以使用包裹standalone
为您提取序言。给定如下所示的完整文档main.tex
,您运行pdflatex
定义mainPreamble.tex
如下的:
mainPreamble.tex
:
\documentclass{article}
\usepackage[subpreambles=true]{standalone}
\begin{document}
\input{main}
\typeout{Sub preamble is now in \jobname.sta.}
Sub preamble is now in \jobname.sta.
\end{document}
这将提取文件的序言mainPreamble.sta
。然后在您需要使用此序言的其他文档中,只需使用:
\UsePackage{main}
并使用从中提取的前导码main.tex
。因此,下面的 MWE 得出:
它使用了question
中的最初定义main.tex
。
笔记:
- 这需要我做一些黑客攻击,
\UsePackage
因为我不太熟悉这个standalone
包的具体用法。所以,也许可以简化,但我相信这可以满足您的要求。
main.tex
:
%% This is main.tex
\documentclass{article}
%% This is the preamble of main.tex
\usepackage{amsmath}
\newcommand{\question}[1]{%
\textbf{Question:}~#1%
}
\begin{document}
\question{%
What does $2+2$ evaluates to?
}
代码:
以下仅运行后mainPreamble.tex
按需要进行编译mainPreamble.sta
:
\documentclass{article}
\newcommand*{\UsePackage}[1]{%
\let\standalonepreambles\relax
\let\endstandalonepreambles\relax
\newcommand{\subpreamble}[1]{}
\let\endsubpreamble\relax
\input{#1Preamble.sta}
}%
\UsePackage{main}
\begin{document}
\question{%
What does $1+1$ evaluates to?
}
\end{document}
答案2
像这样吗?
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{\jobname.hed}
% START YOUR HEADER HERE
\usepackage{lipsum}
\usepackage{amsmath}
% whatever you want in your header
\def\WWW{World}
% END YOUR HEADER HERE
\end{filecontents}
\input{\jobname.hed}
\begin{document}
Hello \WWW!
\lipsum
\end{document}