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