如何将文本复制到文档的另一部分?

如何将文本复制到文档的另一部分?

我在 .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}

相关内容