使用 lualatex 和 gsub 或宏查找并替换以逗号和空格开头的字符串

使用 lualatex 和 gsub 或宏查找并替换以逗号和空格开头的字符串

我需要删除编译后的 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*轻松恢复之前消失的超链接。粘贴宏需要一点工作量,但我喜欢超链接在需要时可以随时恢复。

相关内容