我能否在LaTeX中定义一个变量?

463
在LaTeX中,我该如何定义一个字符串变量,其内容可在编译的PDF中替换该变量使用?
假设我正在编写关于软件的技术文档,我想在导言或其他地方定义包名称,以便如果名称更改,我不必在许多地方都进行替换,只需更改一个地方即可。

2
对于大量内容,值得一提的是 \savebox(https://en.wikibooks.org/wiki/LaTeX/Boxes#savebox)。 - Immanuel Weihnachten
5个回答

512

将以下内容添加到您的导言部分:

\newcommand{\newCommandName}{text to insert}

那么你可以在文本中使用 \newCommandName{}

有关\newcommand的更多信息,请参见例如维基教科书

示例:

\documentclass{article}
\newcommand\x{30}
\begin{document}
\x
\end{document}

输出:

30

52
@DiAlex 当省略花括号时要小心,因为它会干扰插入文本后的空格。请参考这篇文章 - jtpereyda
我无法正确处理非ASCII字符。有什么想法吗? - lindhe
12
这不是一个很好的答案。该命令将在调用时进行评估,而不是在定义时进行评估。因此,从传统语言意义上讲,这不是一个变量。如果该命令从未被调用,则该命令的“主体”将永远不会被评估;如果该命令被调用两次,则该“主体”将被评估两次。 - jg6
3
非常受欢迎,且确实符合发帖者的目的。但它并不是真正的变量。 - myradio
可以运行,但编译器会打印一个错误信息:“未定义的控制序列”。有办法修复吗? - ions me
显示剩余2条评论

199

使用\def命令:

\def \variable {Something that's better to use as a variable}

需要注意的是,\def 命令会在没有任何警告的情况下覆盖预先存在的宏,因此可能会导致各种微妙的错误。要克服这个问题,要么使用带有命名空间的变量,如 my_var,要么退而使用 \newcommand\renewcommand 命令。


19
使用 \def 可能存在问题,因为它不检查预先存在的宏。请参见 LaTeX 地狱的第二圈 - 因此最好使用 \newcommand - Ryan Atallah
2
谢谢@RyanAtallah添加注释。不过,“变量”的意思不是它可能会改变吗? :) - plaes
7
你说得对,但这并不意味着你想使用\def。相反,我认为最好的做法是首先使用\newcommand“初始化”所有要使用的变量(即使只是用\@empty),然后使用\renewcommand创建修改变量的命令。这样可以让你知道变量是否已经存在,因为\newcommand会抛出错误(或至少警告)。 - Nick2253
5
注意,\def 可以用于数学模式下的内容,而 \newCommandName 则不行。(例如,\def\mathExpression{\pi^2 + \sin x} - Jollywatt
1
使用下划线会破坏我需要绘制的 myVar - alper

44

对于描述距离的变量,你可以使用\newlength(并通过\setlength\addlength\settoheight\settolength\settodepth等命令来操作其值)。

同样地,你可以使用\newcounter 来处理类似于章节和图表编号等需要在整个文档中递增的内容。我过去曾经用过它来为代码示例提供一个独立的编号,与其他图表分开计数...

还有值得注意的是\makebox,它允许您存储一些已排版的内容以备将来重复使用(并与\settolength一起使用...)。


36
\newlength{\hcolw}\setlength{\hcolw}{0.47\textwidth}这样的简单用法示例会很有用。 - trybik
我赞同前面的评论;如果没有额外的搜索,使用此答案确实很困难。同时请注意,这个命令应该放在 \begin{document} 之后。 - Yaroslav Nikitenko

28

请参见 https://tex.stackexchange.com/questions/31091/space-after-latex-commands - myrdd

1
我认为您可能希望使用令牌列表来实现这个目的: 设置令牌列表: \newtoks\packagename 指定名称: \packagename={新包名称} 将名称放入输出中: \the\packagename

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接