Auctex:用适当的 TeX 引号替换引号

Auctex:用适当的 TeX 引号替换引号

我正在将 MS Word 文档导出为纯文本,然后将其转换为 LaTeX 格式。我想知道是否有某种自动替换所有双引号的方法,以便

"quoted text"

被替换为

``quoted text''

我无法进行简单的搜索和替换,因为替换显然必须成对进行:对引号的开头和结尾进行不同的替换。我使用带有 auctex 的 emacs,但如果外部包或 shell 脚本更适合处理,我也可以这样做。

答案1

以交互方式,您可以使用

M-<
C-M-% ["]\([^"]*\)["] RET ``\1'' RET !

或者

(query-replace-regexp "\"\\([^\"]*\\)\"" "``\\1''" nil (if (use-region-p) (region-beginning)) (if (use-region-p) (region-end)) nil nil)

答案2

我有一个相当不寻常的解决方案,即使用宏。创建一个宏,然后在文本上重复它。优点是它在某种程度上是交互式的,你可以检查是否有缺失的对等。一个不太优化的版本将是这样的:

F3 C-s " RET Ctrl-SPACE C-s " RET Ctrl-b Ctrl-w Ctrl-b Ctrl-d Ctrl-d `` Ctrl-y '' F4

内容如下:

启动宏 ( F3),然后使用 搜索“ C-s " RET。开始选择 ( Ctrl-SPACE),直到下一个“ ( C-s " RET)。然后返回一个字符 ( Ctrl-b),以排除结束的“,然后使用 取消选择Ctrl-w。返回并删除两个引号 ( Ctrl-b Ctrl-d Ctrl-d),编写 LaTeX 样式的引文 ``,拉出取消的选择 ( Ctrl-y),关闭 LaTeX 引文,然后使用 结束宏F4

如果您仍在关注 (!),通过反复按下F4emacs,将遍历整个文档并替换引文。我复制了一些杰克·伦敦的文字并测试了宏。它如下所示。请注意,暂停是我试图查看宏是否完成了正确的工作...

在此处输入图片描述

答案3

这里有一个完全不同的方法,如果您可以使用 LuaLaTeX 编译文档,则可以使用这种方法:不要对"输入文件中的字符进行任何处理。相反,让 LuaLaTeX 使用智能引号“动态”替换它们。

下面的代码提供了一个名为 的 Lua 函数convert_dumb_quotes_to_smart_quotes,它负责完成所有替换工作。代码还提供了两个 LaTeX 宏,分别称为\QuoteConvOn\QuoteConvOff,它们用于打开和关闭 Lua 函数的操作。如果您的文档包含带有字符的逐字材料,那么能够关闭 Lua 函数会很有用"——这些字符应该不会转换为智能引号,对吧?如果您的一些书目条目包含带有字符的 URL 字符串,那么关闭 Lua"函数也会很有用,因为这些字符也不应该转换为智能引号。

唯一的输入要求是 (a) 所有哑引号必须正确配对,以及 (b) 任何哑引号都不能跨行拆分。我相信这些要求太过繁重。

在此处输入图片描述

% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{luacode} % or 'luacode' environment
%% Lua-side code:
\begin{luacode}
function convert_dumb_quotes_to_smart_quotes ( s )
   return ( s:gsub ( '"(..-)"' , "``%1''" ) )
end
\end{luacode}
%% TeX-side code:
\newcommand\QuoteConvOn{\directlua{ 
  luatexbase.add_to_callback ( "process_input_buffer" , 
  convert_dumb_quotes_to_smart_quotes , "dumb_to_smart" )}}
\newcommand\QuoteConvOff{\directlua{ 
  luatexbase.remove_from_callback ( "process_input_buffer" , 
  "dumb_to_smart" )}}
\AtBeginDocument{\QuoteConvOn} % switch function on by default

\begin{document}
"Hello" World. Hello "World."

\QuoteConvOff  % switch off the Lua function
\verb+"Hello" World. Hello "World."+
\end{document}

相关内容