如何让所有引文都变成斜体?

如何让所有引文都变成斜体?

我的文档中有很多引文,我决定将它们全部改为斜体。因此,对于每个引文,我都必须仔细检查并将“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,bc”,[^abc]表示“任何不是a,bc”的字符)。[^"\n]如果您想要匹配任何不是引号或换行符的字符(如果您的引号中没有换行符),则可以使用 。如果您的引号仅包含字母和数字,则可以使用[0-9a-zA-Z](-表示范围)。

  • *表示前一个子表达式可以重复任意次(包括 0 次),因此[^"]*匹配任何非引号字符序列(包括换行符)。*注意贪婪的:它会尝试包含尽可能多的匹配字符。在某些实现中,您可以使用*?,它执行相同的操作,但包含最少数量的字符。

请注意,字符[]*具有特殊含义。如果您想使用正则表达式搜索这些字符,则需要分别键入\[\]或来转义它们\*。我认为可能需要转义的字符的完整列表是.^$*+?()[]{}\|,但这取决于实现(否则您需要在前面添加\来调用这些字符的特殊含义)。

正则表达式中括在()(或有时\(\))中的部分可用于替换字符串。通常\1表示第一对括号之间的部分、\2第二对括号之间的部分等,但在 Overleaf 中是$1$2等等。括号本身不匹配任何内容,它们只是将内容组合在一起。

因此,您可以对 进行搜索和替换,/"([^"]*)"/并将其替换为\textit{``$1''}。这将在您的文档中查找格式为 的序列"<quote>",并将其替换为\textit{``<quote>''}(我擅自将您的 替换""``'')。您还可以按照 Au101 的建议定义一个宏\qte,然后将其用作\qte{$1}替换字符串。

相关内容