我的文档中有很多引文,我决定将它们全部改为斜体。因此,对于每个引文,我都必须仔细检查并将“Hello”更改为 \textit{“Hello”}。有没有使用替换的快速方法来完成此操作。这样我就可以在引号的左右两侧添加文本,但忽略中间的文本?
顺便说一下,我正在使用 OverLeaf。
任何帮助将非常感激!
答案1
这是一个基于 LuaLaTeX 的解决方案,它适用于智能引号和哑引号。Lua 函数italic_quotes
执行两个字符串替换操作,每种引号方法各一个。下面的解决方案还设置了两个 LaTeX 宏;\iqOn
切换 Lua 函数的操作在,然后\iqOff
将其关闭。
唯一的输入语法要求是开头和结尾的引号之间不能有换行符。
\documentclass{article}
\usepackage{luacode} % for "luacode" environment
%% Lua-side code:
\begin{luacode}
function italic_quotes ( s )
s = s:gsub ( "``..-''", "\\textit{%0}" ) -- smart quotes
s = s:gsub ( '"(..-)"', "\\textit{``%1''}" ) -- dumb quotes
return s
end
\end{luacode}
%% LaTeX-side code
\newcommand\iqOn{\directlua{luatexbase.add_to_callback (
"process_input_buffer", italic_quotes, "italic_quotes" )}}
\newcommand\iqOff{\directlua{luatexbase.remove_from_callback (
"process_input_buffer", "italic_quotes" )}}
\AtBeginDocument{\iqOn}
\begin{document}
"Hello" ``Hello'' Hello ``World'' Hello
\iqOff
"Hello" ``Hello'' Hello ``World'' Hello
\end{document}
答案2
当全部写出来时可能没有什么用,但对于下一次来说,这正是 LaTeX 和其对逻辑结构的强调所针对的。
只需定义一个命令,例如\qte
(不要使用\quote
已经定义的命令):
\documentclass{article}
\newcommand{\qte}[1]{``#1''}
\begin{document}
\qte{Who's the more foolish: the fool, or the fool who follows him?}
\end{document}
然后,您可以随时随地随意更改定义:
\documentclass{article}
\newcommand{\qte}[1]{\textit{``#1''}}
\begin{document}
\qte{Who's the more foolish: the fool, or the fool who follows him?}
\end{document}
答案3
这实际上不是一个 (La)TeX 问题,但是它在这里。
正则表达式就是用来做这种事情的。正则表达式是描述搜索模式的字符串,类似于大多数人都熟悉的通配符*
,?
但功能要强大得多。它们还可用于使用包含(部分)原始文本的替换字符串执行搜索和替换,这正是您所要求的。
我相信大多数 TeX 编辑器都支持正则表达式,但确切的实现可能有所不同。最明显的是,一些字符在正则表达式中具有特殊含义,是否需要转义(即在它们前面加上\
)通常取决于所使用的正则表达式的“风格”。此外,一些更高级的正则表达式类型可能不受所有实现的支持。
这里有一个关联请参阅有关正则表达式的教程,但还有更多。但请注意,并非每种类型的正则表达式都适用于每个编辑器,您可能需要添加或删除几个\
s 才能使您在互联网上找到的正则表达式在您的编辑器中工作。
至于您的具体问题:任何以 开头和结尾的搜索查询都/
被 Overleaf 解释为正则表达式。要查找所有"
-delimited 引号,您可以搜索/"[^"]*"/
。然后,Overleaf 的正则表达式引擎将尝试查找符合以下条件的字符序列:
- 它应该以 a 开头和结尾,
"
因为这些是正则表达式中的第一个和最后一个字符(/
s 只是告诉 Overleaf 这是一个正则表达式) 这些之间
"
应该有一个匹配的字符序列[^"]*
。[^"]
匹配任意字符不是a"
([abc]
表示“一个a
,b
或c
”,[^abc]
表示“任何不是a
,b
或c
”的字符)。[^"\n]
如果您想要匹配任何不是引号或换行符的字符(如果您的引号中没有换行符),则可以使用 。如果您的引号仅包含字母和数字,则可以使用[0-9a-zA-Z]
(-
表示范围)。*
表示前一个子表达式可以重复任意次(包括 0 次),因此[^"]*
匹配任何非引号字符序列(包括换行符)。*
注意贪婪的:它会尝试包含尽可能多的匹配字符。在某些实现中,您可以使用*?
,它执行相同的操作,但包含最少数量的字符。
请注意,字符[
、]
和*
具有特殊含义。如果您想使用正则表达式搜索这些字符,则需要分别键入\[
、\]
或来转义它们\*
。我认为可能需要转义的字符的完整列表是.^$*+?()[]{}\|
,但这取决于实现(否则您需要在前面添加\
来调用这些字符的特殊含义)。
正则表达式中括在()
(或有时\(\)
)中的部分可用于替换字符串。通常\1
表示第一对括号之间的部分、\2
第二对括号之间的部分等,但在 Overleaf 中是$1
,$2
等等。括号本身不匹配任何内容,它们只是将内容组合在一起。
因此,您可以对 进行搜索和替换,/"([^"]*)"/
并将其替换为\textit{``$1''}
。这将在您的文档中查找格式为 的序列"<quote>"
,并将其替换为\textit{``<quote>''}
(我擅自将您的 替换""
为``''
)。您还可以按照 Au101 的建议定义一个宏\qte
,然后将其用作\qte{$1}
替换字符串。