![结合 latex 输入和 sed](https://linux22.com/image/398623/%E7%BB%93%E5%90%88%20latex%20%E8%BE%93%E5%85%A5%E5%92%8C%20sed.png)
我需要包含文件,但我想直接从 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}