我需要删除编译后的 latex 文档中多个超链接文本“, foo bar”的实例。在源代码上使用全局查找和替换会非常费力,因为由于超链接,字符串的每个实例都有不同的代码。此外,我想轻松地关闭和打开字符串的实例。
我曾尝试根据@Mico 的回答使用 lualatex
https://tex.stackexchange.com/questions/213947/how-to-replace-text
因此:
\documentclass[10pt]{article}
% !TEX TS-program = lualatex
\usepackage{luacode}
\begin{luacode}
function myreplace1 ( s )
s = s:gsub ( ", Foo Bar" , "" )
return s
end
\end{luacode}
\AtBeginDocument{\directlua{luatexbase.add_to_callback(%
"process_input_buffer", myreplace1 , "myreplace1")}}
\usepackage{hyperref}
\begin{document}
The Foo Bar at the end of this sentence disappears thanks to myreplace1, Foo Bar.
While this does not, \textbf{\hyperref[sec:Interesting]{Foo Bar}}.
Though, oddly a version of myreplace1 that uses "Foo Bar" without the comma (s = s:gsub ( "Foo Bar" , "" )) works fine with \textbf{\hyperref[sec:Interesting]{Foo Bar}}.
\section{Interesting words} \label{sec:Interesting}
\end{document}
该方法在使用超链接“foo bar”时有效,但如果超链接“foo bar”前面有逗号和空格“,foo bar”,则无效,在这种情况下,字符串在编译后的文本中不会受到影响。据我所知,逗号和空格在 lua 中并不是“魔法”。无论如何,使用转义字符(如 、%
和\\
)[[ ]]
似乎对最终结果没有任何影响。
非常感谢您的帮助!
答案1
我使用以下非 lualatex 黑客来解决我的问题。
% Removes word and preceding space. If *, word and preceding space restored.
\NewDocumentCommand{\sil}{sm}{%
\IfBooleanTF{#1}{#2}%
{\unskip}%
}%
我用\sil{}
(代表“静音”)包围了不需要的超链接(以及周围的标点和空格)。例如,\sil{\textbf{\hyperref[sec:Interesting]{Foo Bar}}}
。超链接文本现在消失了。搜索并替换\sil
可以\sil*
轻松恢复之前消失的超链接。粘贴宏需要一点工作量,但我喜欢超链接在需要时可以随时恢复。