保存包含 \verb 或 \lstinline 的环境的内容

保存包含 \verb 或 \lstinline 的环境的内容

我希望将环境的内容复制到宏中(或复制到临时文件中)。以前我使用以下代码:

\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将此文件读取为输入。它使用\VerbatimOutfancyvrb请参阅这个答案@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}

相关内容