结合 latex 输入和 sed

结合 latex 输入和 sed

我需要包含文件,但我想直接从 PDFLaTeX 中操作它。我必须删除 \{ 和 \} 之间的任何文本,包括反斜杠和括号。我尝试了许多转义选项,但我能得到的最好的结果是这个,但它不起作用:

\input{|"cat cxf.tex | sed 's|\\{.*\\}||g'"}

这可能吗?

答案1

这对我来说有效(pdflatex -shell-escape当然使用)并且只打印“abc”。

\begin{filecontents*}{\jobname-test.tex}
abc\{def\}
\end{filecontents*}

\documentclass{article}

\begin{document}

\input{|"cat \jobname-test.tex | sed 's|\string\\{.*\string\\}||g'"}

\end{document}

问题在于 TeX 对参数执行了宏扩展\input\string\\我们使 的宏性质无效\\

我使用它\jobname只是为了避免破坏我的文件的风险。

如果你想要一个非贪婪的替换,那就有点复杂了(你可以改用 Perl)。搜索字符串应该是这样的

\\{[^\\}]*\\}

通过预先定义字符串可以更轻松地实现这一点:

\begin{filecontents*}{\jobname-test.tex}
abc\{def\}ghi\{jkl\}
\end{filecontents*}

\documentclass{article}

\begin{document}

\edef\searchstring{\string\\\string{[^\string\\\string}]*\string\\\string}}
\input{|"cat \jobname-test.tex | sed 's|\searchstring||g'"}

\end{document}

在这种情况下,输出将是“abcghi”。

答案2

\{假设您可以自由使用 LuaLaTeX,并且进一步假设和之间的材料\}(包括分隔符)都在一行上,则以下解决方案应该适合您。

该解决方案由一个 Lua 函数(存储在外部文件中)和两个 LaTeX 宏组成;第一个宏将 Lua 函数分配给回调process_input_buffer,使其充当预处理器;第二个宏删除 Lua 函数的类似预处理器的操作。

在此处输入图片描述

模式匹配操作 ,"\\{.-\\}"使用.-而不是-*来匹配“任意字符的零个或多个实例”。请注意,使用-*在此处是一个错误,因为它会让 Lua 执行“贪婪”匹配,从而不恰当地抹去中间子字符串uvw

\RequirePackage{filecontents}
%% External file with "\{ ... \}" material
\begin{filecontents*}{cxf.tex}
$abc \{...\} uvw \{ \int_0^1 \} xyz$

abc\{ ... \}uvw\{ \int_0^1 \}xyz
\end{filecontents*}

% Place the Lua code in a separate external file
\begin{filecontents*}{external.lua}
function remove_braced_stuff ( s )
   return ( s:gsub ( "\\{.-\\}" , "" ) )
end
\end{filecontents*}

\documentclass{article}
%% Load the Lua function from the external file
\directlua{dofile("external.lua")}

%% Two utility LaTeX macros
\newcommand{\RemoveBracedStuff}{\directlua{
  luatexbase.add_to_callback ( "process_input_buffer" , 
    remove_braced_stuff , "removestuff" )}}
\newcommand{\DontRemoveBracedStuff}{\directlua{
  luatexbase.remove_from_callback ( "process_input_buffer" , 
    "removestuff" )}}

\begin{document}
\RemoveBracedStuff % Enable the Lua function
\input cxf % Load the external file

\DontRemoveBracedStuff % Disable the Lua function
%% remainder of document
\end{document}

相关内容