答案1
\text
对于自制宏来说,不是最好的名称选择。\text
已经在 LaTeX 中定义并广泛使用。
这个问题涉及几个方面:
序列
\text
(或分别为序列\text1
或序列\text2
)旨在同时满足两个目的:首先,为“变量”分配“值”。其次,“输出”“变量”的“值”。这让我想起了重载的概念。这在 TeX 中是不可能的。在 TeX 中,控制序列不能同时具有不同的当前定义。可以\text
这样定义序列,使其在不同时间的行为(例如,取决于“标志”)不同/在不同情况下的行为不同,需要通过设置相应的标志来指示其发生。或者在开始文档环境之前重新定义控制序列。在 LaTeX 中,所谓的钩子可用于自动延迟重新定义等操作,方法是在序言中将宏附加到“钩子”指令中,重新定义该指令将一直挂起,直到处理启动文档环境的指令。 “钩子”表示你可以钩住某些事情完成时发生的事情,例如启动文档环境,结束文档环境,...在读取和标记 .tex 输入时,TeX 仅接受类别代码为 11(字母)的字符作为控制字标记名称的组成部分。(简言之,控制序列标记有两种类型:如果控制字标记的名称由单个字符组成,并且其类别当前不是 11(字母),则它为控制符号标记。在所有其他情况下,例如,如果名称由多个字符组成,则它为控制字标记。)类别代码 11 的目的是允许在 .tex 输入文件中出现的字符用作控制字标记名称的组成部分/控制序列标记的名称可能由多个字符组成。例如,数字 0、1、2、3、4、5、6、7、8、9 通常不具有类别代码 11(字母),而是具有类别代码 12(其他),并且通常不能用作控制字标记名称的组成部分。为它们分配类别代码 11(字母)似乎很明显。但是,我不认为这是推荐的做法,因为在处理 .tex 输入时,它可能会在几个地方产生意想不到的效果。
在您的问题中,您提到了“变量”的概念。如果您吹毛求疵的话,“变量”和“值”这两个概念是用于创建可执行程序的高级编程语言中的概念。在 TeX 中,您可以在一定程度上应用“变量”和“值”的概念。但是在 TeX 中编程时,您需要实现这个概念,因此 TeX 底层概念(如“标记化”、“标记”、“赋值”、“宏”、“扩展”和“宏参数”)会发挥作用。
根据您想要对“变量”的“值”执行的操作,我建议简单地使用例如\newcommand
定义不处理参数而仅提供替换文本的宏,其中定义为宏的控制字标记代表“变量”,并且通过扩展宏,形成宏的替换文本的标记形成“变量”的“值”。
例如,你可以这样做:
\documentclass{article}
\newcommand\textA{This is text from the textA variable and it is added in here.}
\newcommand\textB{This is text from the textB variable and it is added in here.}
\begin{document}
\section{First section}
\textA
\section{Second section}
\textB
\end{document}
如果能够在“变量”名称中/在控制序列标记的名称中使用没有类别代码 11(字母)的字符(例如数字)很重要,我可以提供一个宏,\CsNameToCsToken
该宏用于从标记流中收集字符标记序列并用相应的控制序列标记替换该字符标记序列,并在后台使用\csname..\endcsname
它来执行此操作。
\makeatletter
%%===============================================================================
%% End \romannumeral-driven expansion safely:
%%===============================================================================
\@ifdefinable\UD@stopromannumeral{\chardef\UD@stopromannumeral=`\^^00}%
%%===============================================================================
%% Obtain control sequence token from sequence of explicit character tokens
%% denoting the name of control sequence token:
%%===============================================================================
%%
%% \CsNameToCsToken<stuff not in braces>{NameOfCs}
%%
%% yields
%%
%% <stuff not in braces>\NameOfCs
%%
%% (<stuff not in braces> may be empty/nothing.)
%%
\@ifdefinable\CsNameToCsToken{%
\long\def\CsNameToCsToken#1#{\romannumeral\InnerCsNameToCsToken{#1}}%
}%
\newcommand\InnerCsNameToCsToken[2]{%
\expandafter\UD@exchange\expandafter{\csname#2\endcsname}{\UD@stopromannumeral#1}%
}%
\newcommand\UD@exchange[2]{#2#1}%
\makeatother
\documentclass{article}
\CsNameToCsToken\newcommand{text1}{This is text from the text1 variable and it is added in here.}
\CsNameToCsToken\newcommand{text2}{This is text from the text2 variable and it is added in here.}
\begin{document}
\section{First Section}
\CsNameToCsToken{text1}%
\section{Second Section}
\CsNameToCsToken{text2}%
\end{document}
这种方法不会重新定义已经定义并广泛使用的控制字标记\text
。
答案2
我会scontents
尝试一下这个包。将您想要重复的部分封装在scontents
环境中,然后使用 调用它\getstored
。
\begin{scontents}[store-env=a_name]
text that you want to repeat
\end{scontents}
\getstored{a_name}
a_name
是您选择的名称。
答案3
正如您所说,您可能只是使用宏。不幸的是,默认情况下,它们的名称不能包含数字:
\newcommand\textOne{Blabla}
\newcommand\textTwo{More blabla}
\section{Introduction}
\textOne % will display Blabla
\textTwo % will display More blabla
\section{Summary}
As we already said: \textOne
如果您想使用包含数字(或其他符号)的“变量名”,您可以这样做\csname ...\endcsname
:
\defText#1#2{\expandafter\newcommand\csname text:#1\endcsname{#2}}
\useText#1{\csname text:#1\endcsname}
\defText{1}{This is the first paragraph.}
\defText{2}{This is the second paragraph.}
\section{Introduction}
\useText{1}
\useText{2}
\section{Summary}
As we already said: \useText{1}
(在本例中,由于“1”和“2”都是个位数,因此甚至可以省略它们周围的 {},即使用:\defText1{...}
和\useText1
。)
更有趣的是,如果你想稍后定义文本在文档中(例如在参考文献部分),但尽早使用(在正文中),那么您大致需要该\label
命令的作用(即将信息写入在.aux
(后续)编译开始时读取的文件中),使用定制信息代替当前部分名称或方程标签等。考虑一下:
\documentclass{article}
\makeatletter
% Define the label #1 to be #2, so \ref{X} gives Y:
\def\LABEL#1#2{\protected@edef\@currentlabel{#2}\label{#1}}
\begin{document}
\section{Introduction}
Anticipating the result, we will prove in this paper that: \ref{text1}
\section{Conclusion}
From what precedes, we conclude:
\LABEL{text1}{We are the best.}
\ref{text1}
\end{document}