我希望将环境的内容复制到宏中(或复制到临时文件中)。以前我使用以下代码:
\usepackage{environ}
\def\SavedContent{}
\NewEnviron{savecontent}{%
\BODY%
% \global\let\SavedContent\BODY%
\expandafter\gdef\expandafter\SavedContent\expandafter{\BODY}
}
\verb
然而,如果存在或\lstinline
在环境中,则此方法无效。
后来我发现这个问题。答案描述了一种工作方式:
...实现一个环境,逐字读取其主体,然后在宏定义中包装事物......
不幸的是,答案太复杂了,我不明白。因此我想问:应该如何savecontent
正确定义环境?
补充:内容不必存储到宏中。如果可以将内容保存到文件中并在以后读取,也可以。如何实现这一点?
这题的动机是想把摘要的内容保存下来,以后展示出来。
以下是 MWE:
\documentclass{article}
\usepackage{environ}
\def\SavedContent{}
\NewEnviron{savecontent}{%
\BODY%
% \global\let\SavedContent\BODY%
\expandafter\gdef\expandafter\SavedContent\expandafter{\BODY}
}
\begin{document}
\begin{savecontent}
Some text
\end{savecontent}
\SavedContent
% \begin{savecontent}
% \verb|code|
% \end{savecontent}
% \SavedContent
\end{document}
答案1
如果你可以自由使用 LuaLaTeX,以下解决方案可能会让你感兴趣。这是一个稍微简化的版本这个答案。只需将代码复制到行%%% >>>>>
和%%% <<<<<
序言之间,用\Verbatim
和\EndVerbatim
行括住您想要保存的逐字材料,然后根据需要使用\printverbatim
和。\useverbatim
在之前的回答中,我提供了更多关于此方法如何工作以及为什么代码是“防弹的”的背景信息,从某种意义上说,逐字材料几乎可以是任何东西。
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{lipsum} % for filler text
%%% >>>>>
\usepackage{luacode} % for "luacode" environment
%% Lua-side code: define 1 Lua table and 3 Lua functions
\begin{luacode}
verb_table = {}
function store_lines ( s )
if s:find ( "\\EndVerbatim" ) then
luatexbase.remove_from_callback (
"process_input_buffer" , "store_lines")
else
table.insert ( verb_table , s )
end
return ""
end
function register_verbatim ()
verb_table = {}
luatexbase.add_to_callback(
"process_input_buffer" , store_lines , "store_lines")
end
function print_lines ( catcode )
if catcode then
tex.print ( catcode , verb_table)
else
tex.print ( verb_table )
end
end
\end{luacode}
%% TeX-side code: define several LaTeX macros
\def\Verbatim{\directlua{register_verbatim()}}
\def\useverbatim{\directlua{print_lines()}}
\def\printverbatim{%
\par
\bgroup
\setlength{\parindent}{0pt}
\ttfamily
\directlua{print_lines(1)}
\egroup
}
\def\createcatcodes{%
\bgroup
\catcode`\\=12 \catcode`\{=12 \catcode`\}=12
\catcode`\$=12 \catcode`\&=12 \catcode`\^^M=13
\catcode`\#=12 \catcode`\^=12 \catcode`\_=12
\catcode`\ =13 \catcode`\~=12 \catcode`\%=12
\savecatcodetable 1 % '\savecatcodetable' is a LuaTeX primitive
\egroup}
\createcatcodes
\def\Space{ }
\bgroup
\catcode`\^^M=13\gdef^^M{\quitvmode\par}%
\catcode`\ = 13\gdef {\quitvmode\Space}%
\egroup
%%% <<<<<
\begin{document}
\Verbatim
\begin{abstract}
\noindent
\lipsum[1][1-7] % output first 7 sentences of first para
\end{abstract}
\EndVerbatim
\hrule\smallskip
\printverbatim
\smallskip\hrule
\useverbatim
\hrule
\end{document}
答案2
下面是部分解决方案,仅保存最后一个savecontent
环境的内容。savecontent
环境将其内容保存到文件\jobname.mytmp
,然后宏\SavedContent
将此文件读取为输入。它使用\VerbatimOut
,fancyvrb
请参阅这个答案@egreg。
如果希望保存所有savecontent
环境中的内容,可以考虑使用计数器来标记相应的环境。
\documentclass{article}
\usepackage{fancyvrb}
\def\SavedContent{\input{\jobname.mytmp}}
\newenvironment{savecontent}{%
\VerbatimOut{\jobname.mytmp}%
}{
\endVerbatimOut%
}
\begin{document}
\begin{savecontent}
Some text
\end{savecontent}
\SavedContent
\begin{savecontent}
\verb|code|
\end{savecontent}
\SavedContent
\end{document}