使用稍后定义的宏值

使用稍后定义的宏值

有没有办法得到类似的东西

\test
\newcommand{\test}{Print me!}

以同样的方式工作

\newcommand{\test}{Print me!}
\test

可以吗?基本上,我想知道我是否可以在编译阶段执行的某个东西中设置一个宏或预定义值,然后如果我在 LaTeX 文件中定义它之前使用它,它就会正确显示。

感谢您的帮助!

答案1

TeX 在开始编译时就像一条单行道。因此,您必须使用其他方法(包括其他宏用法)来实现您想要的效果。

下面的命令\laterdef就像一个“ \label”,它将一个g全局(重新)def初始化写入.aux 立即地. 第一次编译输出abc\test,后续编译输出为def

\documentclass{article}

\providecommand{\test}{abc}% Create \test to be abc

\makeatletter
\newcommand{\laterdef}[2]{%
  \protected@write\@auxout{}{\gdef\string#1{#2}}}
\makeatother

\begin{document}

\test

\laterdef{\test}{def}% Overwrite \test to be def

\end{document}

.aux作为 的一部分读入\begin{document}。因此,在和\test之间进行的任何重新定义都将使 的使用无效。\begin{document}\test\laterdef

如果没有\providecommand{\test},您将在第一次编译时收到错误。

答案2

首先我想强调的是,LaTeX 已经为最常见的需要“延迟定义”的情况提供了一种机制。如果你想在生成数字的位置或事件发生的页码之前使用生成的数字,你只需将其放在\label{<string>}生成数字的命令之后,然后你就可以通过 打印生成的数字\ref{<string>}或页码了\pageref{<string>}

生成的编号例如是章节编号或项目编号等等enumerate

在命令定义之前,无法使用它,因为 TeX 每次只处理一个标记(宏可以随时更改其含义)。上述机制通过在文件中写入注释来实现.aux,因此“延迟项目”只有在下次运行 LaTeX 时才会知道。这可能看起来很烦人,但在第一次运行 LaTeX 时,文档永远不会完成,所以这实际上不是问题。

你甚至可以滥用上述机制:

\newcounter{laterdef} % just a dummy counter
\newcommand{\laterdef}[2]{%
  \renewcommand\thelaterdef{#2}%
  \refstepcounter{laterdef}\label{#1}%
}

这是一个完整的例子,其中文本有特殊命令(此处为重音)以表明一般不需要特殊保护;某些命令可能需要\protect在它们前面(在网站上查找“脆弱命令”)。

\documentclass{article}

\newcounter{laterdef} % just a dummy counter
\newcommand{\laterdef}[2]{%
  \renewcommand\thelaterdef{#2}%
  \refstepcounter{laterdef}\label{#1}%
}

\begin{document}

This is some text where we want to
use something that will be known only
later: \ref{test}.

Here is text that follows.

Now we define the contents needed
above.

\laterdef{test}{Na\"ive Stra\ss e}

\end{document}

在 LaTeX 运行期间,您可能会在控制台上看到以下消息:

LaTeX Warning: Reference `test' on page 1 undefined on input line 13.

LaTeX Warning: There were undefined references.

LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.

如果您稍后更改中的文本\laterdef,您将只会看到最后一条消息;前两条消息发生在参考尚不清楚的情况下。

第一次运行 LaTeX 将产生

在此处输入图片描述

未知文本已被替换为??

下一次运行 LaTeX 将会生成

在此处输入图片描述

如果你够大胆,想自己定义一个机制,你可以:

\documentclass{article}

\makeatletter
\newcommand{\lateruse}[1]{%
  \@ifundefined{late@#1}{??}{\@nameuse{late@#1}}%
}
\newcommand\laterdef[2]{%
  \protected@write\@auxout{}{%
    \global\string\@namedef{late@#1}{#2}%
  }%
}
\makeatother

\begin{document}

This is some text where we want to
use something that will be known only
later: \lateruse{test}.

Here is text that follows.

Now we define the contents needed
above.

\laterdef{test}{Na\"ive Stra\ss e}

\end{document}

相关内容