在一篇很长很长的文章中。我有一段在多个地方/部分/章节中重复的文本。当我编辑时,我更改了这段文本中的 2 或 3 个单词。这些更改必须应用于文档中所有重复的内容。问题是,我如何自动执行此操作?
我正在寻找的解决方案如下:
Lorem ipsum \textthatrepeatselsehwhere{This text will be shown in several places}\label{textrep1} lorem ipsum.
Lorem ipsum \displaytextoflabel{textrep1} lorem lorem.
输出应如下所示:
Lorem ipsum 此文本将在多个地方显示 lorem ipsum。
Lorem ipsum 此文本将在多个地方显示 lorem lorem。
解决方案可能很明显,但我不知道该怎么做。谢谢,任何帮助都将不胜感激。
答案1
您可以为这项工作定义一个宏。
\newcommand\mytext{This text will be shown in several places\xspace}
一位 MWE 表示:
\documentclass{article}
\usepackage{xspace}
\newcommand\mytext{This text will be shown in several places\xspace}
\begin{document}
Lorem ipsum \mytext lorem ipsum.
Lorem ipsum \mytext lorem lorem \mytext.
\end{document}
答案2
直接的\newcommand
最简单的答案是\newcommand
:
\documentclass{article}
\newcommand*{\textrepi}{This text will be shown in several places}
\newcommand*{\Lorem}{Lorem ipsum}
\begin{document}
\Lorem \textrepi lorem lorem. (!)
\Lorem\ \textrepi\ lorem lorem.
\Lorem{} \textrepi{} lorem lorem.
\end{document}
正如您在第一行中看到的,空格控制容易出错,因为 TeX 会忽略命令名称后的空格。这个问题可以通过xspace
使用启发式方法来确定是否应该插入或隐藏空格的软件包来解决。
\documentclass{article}
\usepackage{xspace}
\newcommand*{\textrepi}{This text will be shown in several places\xspace}
\newcommand*{\Lorem}{Lorem ipsum\xspace}
\begin{document}
\Lorem. \textrepi lorem lorem.
\end{document}
- 的宏名
\newcommand
不是自由的。不能直接使用除字母以外的其他字符。
间接 \newcommand
此方法使用字符串而不是命令来访问文本。在示例中,\newreptext
使用名称记住文本。\reptext
打印存储在给定名称下的文本:
\newreptext{lorem}{Lorem ipsum dolor sit amet, \dots}
Some text. \reptext{lorem} consectetuer ...
实现及示例:
\documentclass{article}
\makeatletter
\newcommand*{\newreptext}[1]{%
\begingroup % babel shorthand support
\csname @safe@actives@true\endcsname
\expandafter\endgroup
\expandafter\newcommand\csname reptext@#1\endcsname
}
\newcommand*{\reptext}[1]{%
\begingroup
\csname @safe@actives@true\endcsname % babel shorthand support
\@ifundefined{reptext@#1}{%
\@latex@error{\string\reptext{#1} is undefined}\@ehc
\endgroup
\textbf{??}%
}{%
\endgroup
\@nameuse{reptext@#1}%
}%
}
\makeatother
\newreptext{textrep1}{This text will be shown in several places}
\newreptext{Lorem}{Lorem ipsum}
\begin{document}
\reptext{Lorem} \reptext{textrep1} lorem lorem.
\end{document}
宏定义的本质
\newreptext
很简短:% \newreptext{<name>}{<text>} \newcommand*{\newreptext}[1]{% \expandafter\newcommand\csname reptext@#1\endcsname }
内部(第二个参数,目前还未看到)存储在宏中
\reptext@<name>
。TeX 原语\csname
允许构造任意宏名。宏名前缀reptext@
创建了一种穷人的名字空间,以避免宏名冲突。babel
该示例还增加了对参数内包的活动简写字符的支持<name>
。由于 的语法
\reptext{<name>}
,末尾的花括号避免了命令名后的空格被忽略的问题。
LaTeX 参考文献
也可以使用 LaTeX 参考系统来实现此目的,如问题中开始的那样。
\displaytextoflabel
变得简单\ref
并且\textthatrepeatselsehwhere
可以处理\label
。
\documentclass{article}
\makeatletter
\newcommand*{\labeltext}[2]{%
\begingroup
\def\@currentlabel{#2}%
\label{#1}%
\endgroup
#2%
}
\makeatother
\begin{document}
Lorem ipsum \ref{textrep1} lorem lorem.
Lorem ipsum \labeltext{textrep1}{This text will be shown in several
places} lorem ipsum.
Lorem ipsum \ref{textrep1} lorem lorem.
\end{document}
- 因为文本进入
.aux
文件,所以需要小心需要的脆弱宏\protect
。 - 需要运行两次 LaTeX 才能解析引用。
包裹acronym
缩写包似乎有点大材小用,它易于使用,并提供附加功能。只\acl
需要参考,因为我们总是需要缩写的长文本形式。
\documentclass{article}
\usepackage{acronym}
\newacro{textrep1}{This text will be shown in several places}
\begin{document}
\acl{Lorem} ipsum \acl{textrep1} lorem lorem.
\acl{Lorem} \acl{textrep1} lorem lorem.
\acrodef{Lorem}{Lorem ipsum}
\end{document}
\newacro
与该方法类似\newcommand
,缩写词会保存在内存中,之后可用。它不会存储并记住在文件中.aux
。\defacro
\label
与/方法类似\ref
。首字母缩略词存储在.aux
文件中,因此可在 处获取\begin{document}
。
该包acronym
还可用于帮助组织缩写文本。示例场景:
文本存储在环境中的acronym
单独文本文件中reptexts.tex
:
\begin{acronym}
\acro{rep1}{My repetition text}
\acro{relax}{Relax and calm down}
\acro{Disclaimer}{My standard disclaimer}
\acro{textrep1}{This text will be shown in several places}
\acro{Lorem}{Lorem ipsum}
\end{acronym}
现在上一节的示例简化为:
\documentclass{article}
\usepackage{acronym}
\renewenvironment{acronym}{\let\acro\newacro}{}
\input{reptexts}
\begin{document}
\acl{Lorem} \acl{textrep1} lorem lorem.
\acl{Lorem} \acl{textrep1} lorem lorem.
\end{document}
您还可以生成另一个文档,列出所有文本及其缩写标签:
\documentclass{article}
\usepackage{acronym}
\begin{document}
\input{reptexts}
\end{document}
答案3
我认为您的问题是,您有一段很长的文本,该文本在文档中重复多次,并且您需要将这段文本中的两个或三个单词从一个文本实例更改为另一个文本实例。为了满足这一需求,您可以定义一个宏,将长文本和长文本中可以随实例而变化的单词作为其参数。
以下 MWE 将一些填充文本作为长文本的基本元素,并提供了将三个词从一个调用更改为另一个调用的方法。
\documentclass{article}
\newcommand{\longtext}[3]{Lorem ipsum dolor sit amet, consectetur #1 elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
commodo consequat. Duis aute #2 dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat #3 non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.}
\begin{document}
\longtext{adispicing}{irure}{cupidatat}
\end{document}