复制并重用环境的内容

复制并重用环境的内容

有没有办法将文本嵌入到一个文件中的多个环境(或结构、\chapter、\section 等)中,并“复制”/插入其他文件中单个环境项的内容?我注意到了剪贴板和提取包,并考虑过 \def 和 \newcommand。但这些并不令人满意,主要是因为它对我来说似乎不美观;我只想要普通的环境。

提取包只是将内容放入一个新文件中,而这正是我想要避免的。考虑大量的格言、名言或方程式(以及其他内容,因此解决方案应该足够抽象以处理不同的内容,我想环境会很适合)。我只是不想为每个项目建立一个文件,那会太多了。

因此,像“我想使用环境 x,这个 x 应该命名为 x1,那个 x2 和另一个 x3”这样的东西就像我对提取包所做的那样,会很愉快,只是我现在需要访问这些 x1、x2 和 x3,而不是文件。就像“我想在这里放置 x1 的副本,在那里放置 x2 的副本,在这里再次放置 x1 的副本,在那里放置 x3 的副本”。

举例来说,我想要类似这样的东西:

quotesFile.tex:

\begin{myquote} % any environment
\contentName{quote1} % define some kind of identifier 
                     % for this environments content
This is a quote
\end{myquote}

\begin{myquote}
\contentName{quote2}
lorem ipsum dolor sit amet
\end{myquote}

\begin{myquote}
\contentName{quote3}
foo bar baz foobar foobaz
\end{myquote}

在 otherfile.tex 中:\include{quotesFile}

\placeContent{quote2} % I want something as simple 
                      % as this to insert the content 
                      % of the environment, here with 
                      % the identifier "quote2"

\placeContent{quote3} 

因此输出应该是:
lorem ipsum dolor sit amet

foo bar baz foobar foobaz

我不想要类似的东西

\newcommand{\quote1}[]{This is a quote}

有几个原因。好吧,这在某种程度上可以解决问题,但在我看来并不美观(怪我)。我更喜欢保持整洁,而所有括号和命令实际上只是简单的文本,在我看来并不整洁,反而令人困惑。根据我的观点和理解,命令/宏应该用于避免重复代码,但不能用于普通的文本内容。

答案1

在这种情况下要使用的包是:

http://www.ctan.org/tex-archive/macros/latex/contrib/catchfilebetweentags/为此类文档系统提供了最清晰的代码,每个文档可能都引用了其他文档的部分内容。

基本上,基于在文档中放置具有某种索引约定的标签(在其中放置经常重复使用的代码或文本的特定环境)的组织系统允许根据需要使用每个部分,而这些部分可能会散布在许多文档中并重复使用。

如果索引约定很巧妙(使用不同的素数相乘来在文档中进行唯一标记,就像软件中经常做的那样,正如唯一一位因其努力而被后人认可的科学家所建议的那样,他用自己的名字命名了一个饼干品牌?)或很直接,比如说 [Lichtenberg]{B-25},它代表了 Lichtenberg 的期刊 B 中的第 25 条格言,可以在一份更大的文档(Lichtenberg 的引文文件,该文件本身分为 A、B、C 部分,根据本例中引文来源的期刊)中找到。

答案2

只需稍微改变输入,下面的操作同样有效:

在此处输入图片描述

\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{myquotes.tex}
\begin{myquote}{quote1}
This is a quote
\end{myquote}

\begin{myquote}{quote2}
lorem ipsum dolor sit amet
\end{myquote}

\begin{myquote}{quote3}
foo bar baz foobar foobaz
\end{myquote}
\end{filecontents*}

\usepackage{environ}
\newcommand{\myquotearg}{}
\NewEnviron{myquote}[1]{%
  \renewcommand{\myquotearg}{#1}% Store myquote environment argument
  \ifx\myquotearg\contentName% Match argument with content name
    \BODY% Print myquote environment body
  \fi
  \ignorespaces
}
\newcommand{\contentName}{}
\newcommand{\placeContent}[1]{%
  \renewcommand{\contentName}{#1}% Store content name
  \input{myquotes}}% Read input file
\begin{document}

\placeContent{quote2}

\placeContent{quote3}

\end{document}

变化是为了向您的myquote环境提供一个参数,然后用它来检查的参数\placeContentenviron是这里的关键,它允许将环境中的所有内容吞入其中\BODY。我们只是根据参数是否匹配来决定是否打印它\contentName

答案3

@Werner 回应的替代方案。使用该scontents包可以轻松获得您要查找的内容。所有内容都存储在内存中,包括内容verbatim。如果您愿意,还可以使用密钥将内容保存到外部文件中write-env=file.tex。感谢@Werner 的 MWE 和想法 :)。

\documentclass{article}
\usepackage[store-env=quote]{scontents}
\pagestyle{empty}
\begin{scontents}
This is a quote
\end{scontents}

\begin{scontents}
lorem ipsum dolor sit amet
\end{scontents}

\begin{scontents}
foo bar baz foobar foobaz
\end{scontents}
\begin{document}
Some text
\getstored[2]{quote}

\getstored[3]{quote}

\getstored[1]{quote}

\end{document}

相关内容