我在 .tex 文件的一部分中有一个段落,我想将其复制到 .tex 文件的另一部分。
我可以按 ctrl-c、ctrl-v……就这么简单,但如果我修改了一个地方,就必须对另一个地方做同样的事情。
有没有办法在文档的某个部分取出一段文本,用某个参考标记将其围起来,然后在其他地方使用这个参考标记来复制文本?
编辑:我可以这样做
\newcommand{\textA}{piece of text}
然后在\textA
我想要此文本出现的任何地方使用。
但是,我希望\textA
在文档中的某个位置(在 .tex 文件中)进行定义。该位置在我第一次使用此宏后出现。
宏只能在文档中定义它们的位置使用,所以我不能这样做。
答案1
使用该clipboard
包复制和粘贴内容(在同一个文档中,或跨多个文档)。
\documentclass{article}
\usepackage{clipboard}
\begin{document}
\Copy{MyKey}{piece of text}
\Paste{MyKey}
\end{document}
输出:
答案2
你可以做:
\newcommand{\mylongtext}{%
%write your text here...
}
然后每次你想要排版此文本时,只需输入:
\mylongtext
答案3
有人可能会滥用该.aux
文件。
\documentclass{article}
\makeatletter
\newcommand\remembertext[2]{% #1 is a key, #2 is the text
\immediate\write\@auxout{\unexpanded{\global\long\@namedef{mytext@#1}{#2}}}%
#2%
}
\newcommand\recalltext[1]{%
\ifcsname mytext@#1\endcsname
\@nameuse{mytext@#1}%
\else
``??''
\fi
}
\makeatother
\begin{document}
Here we want \recalltext{foo}.
Next we print \remembertext{foo}{``a nonsense phrase with no verb''}
\end{document}
如果某些文本引用发生变化,该版本还会发出警告。
\documentclass{article}
\makeatletter
\newif\ifmytext@warning
\newcommand\remembertext[2]{% #1 is a key, #2 is the text
\ifcsname mytext@#1\endcsname
\begingroup
\long\def\@tempa{#2}%
\expandafter\ifx\csname mytext@#1\endcsname\@tempa
% didn't change
\else
\global\mytext@warningtrue
\fi
\endgroup
\fi
\immediate\write\@auxout{\unexpanded{\global\long\@namedef{mytext@#1}{#2}}}%
#2%
}
\newcommand\recalltext[1]{%
\ifcsname mytext@#1\endcsname
\@nameuse{mytext@#1}%
\else
``??''
\fi
}
\AtEndDocument{%
\ifmytext@warning
\@latex@warning@no@line{Text references may have changed, rerun}
\fi
}
\makeatother
\begin{document}
Here we want \recalltext{foo}.
Next we print \remembertext{foo}{``a nonsense phrase with no verb''}
\end{document}
答案4
这是与@jon 类似的答案。您需要编译两次(无论如何,这很常见,以便正确引用)但不需要更改文档中的任何内容。
第二次运行中的页码可能会发生变化,这可能会影响一些页面引用,因为这些引用是在第一次运行中设置的。如果您的paragraph.tex
文件一开始的内容与您最终期望的内容大致相同,则它们不太可能发生变化。如果这是一个真正的问题,我可以想象一些解决方法。
\documentclass{article}
\newcommand{\textA}{\input paragraph}
\newcommand{\settextA}[1]{%
\newwrite\delayedtext
\immediate\openout\delayedtext=paragraph.tex
\immediate\write\delayedtext{#1}
\immediate\closeout\delayedtext
% #1 % uncomment to have this text appear where it's defined, too
}
\begin{document}
Here is the delayed text:
\textA
But that text wasn't written until now.
\settextA{
Now is the time for all good folks to come to the aid of the party
}
\end{document}