我正在使用书籍文档类编写 tex 文档。我已经输入了近 100 页,但我在输入单引号和双引号时犯了一个错误。我按照如下方式操作:
"test double quotes"
并'test double quotes'
生成了以下形式的输出:
有没有办法可以生成正确的输出而不更改所有地方的引号?我看到了一些类似的答案@除了 `` + '' 之外,在 LaTeX 中还有其他方法可以使用双引号吗?但似乎都不起作用。
答案1
这是一个基于 LuaLaTeX 的解决方案,它不需要您修改现有的"..."
和'...'
引号对。它由一个名为msq
(“make smart quotes”的 Lua 函数)和两个名为 的实用 LaTeX 宏组成,\msqOn
它们\msqOff
分别激活和停用 Lua 函数。通过“激活 Lua 函数”,我的意思是将其分配给 LuaTeX 的process_input_buffer
回调,它在其中充当输入流的预处理器。
附录,发布于 2023 年 3 月 1 日:如果 (a) 您的文档使用"
表示十六进制数(例如"FF=256
),并且输入行中有两个以上的十六进制数,(b) 如果您"
在 babel 简写表达式中使用,或者 (c) 如果您使用"
表示包含空格的文件名;例如,xxx"aaa bbb"ccc.tex
表示文件名 ,则您不应使用此答案将“愚蠢”替换为“智能”双引号xxxaaa bbbccc.tex
。请参阅@DavidCarlisle 最近的回答了解更多信息。当然,如果这些问题之一恰好出现在文档中界限分明的部分,您可以msq
通过在有问题的部分开始时执行来“保护”它免受预处理器的操作\msqOff
(稍后再执行\msqOn
以重新启动预处理器操作)。
\documentclass{book}
\usepackage[english]{babel} % or some other suitable language choice
\usepackage[autostyle]{csquotes}
\usepackage{luacode}
\begin{luacode}
-- msq: "make smart quotes"
function msq ( s )
s = s:gsub ( '"(.-)"' , "\\enquote{%1}" )
s = s:gsub ( "'(.-)'" , "`%1'" )
return s
end
\end{luacode}
\newcommand{\msqOn}{\directlua{ luatexbase.add_to_callback(
"process_input_buffer", msq , "msq" )}}
\newcommand{\msqOff}{\directlua{ luatexbase.remove_from_callback(
"process_input_buffer", "msq" )}}
\begin{document}
\msqOn
"test double quotes" and 'test single quotes'
"\,'Twas brillig and the slithy toves \ldots"
\medskip
\msqOff
"test double quotes" and 'test single quotes'
\end{document}
答案2
首先用编辑器替换最后一个引号,然后“搜索并替换”
"<space> -> }
然后用
" -> \enquote{
然后总是使用:
\documentclass{article}
\usepackage[french,ngerman,english]{babel}
\usepackage[autostyle]{csquotes}
\begin{document}
\enquote{quote}
\enquote*{quote}
\enquote{quote \enquote{quote in quote}}
\foreignquote{ngerman}{quote}
\foreignquote*{ngerman}{quote}
\foreignquote{ngerman}{quote \foreignquote{ngerman}{quote in quote}}
\foreignquote{french}{quote}
\foreignquote*{french}{quote}
\foreignquote{french}{quote \foreignquote{ngerman}{quote in quote}}
\end{document}
答案3
您可以将"
和设置'
为活动字符并做适当的定义:
\catcode`\"=13 \def"{\bgroup \def"{”\egroup}“}
\catcode`\'=13 \def'{\bgroup \def'{\char`\'\egroup}`}
"test double quotes" and 'test double quotes'
\bye