这边还有一些其他问题涉及相关问题,但我没有找到任何问题能够准确解决我的问题。
我有一段文本(从 XML 转换而来),其中的撇号'
有三种不同的含义:引文开头、引文结尾以及缩写和属格(can't
、cats'
等)。有没有办法让撇号保持'
原样?除了开头的引号之外的所有情况,其中必须将其替换为“?”。供您参考,我实际上在原始文档中使用了 XeLaTeX,但我不确定这是否重要。
\documentclass{memoir}
\begin{document}
He said, 'the cats' hats can't fit me'.
\end{document}
我猜确定使用哪一个的方法是:
- 如果撇号前面有文本字符,则保留它
- 如果前面有其他内容(包括空格或什么都没有),则将其更改为 `
笔记:单词开头的缩写撇号(例如'tis
)不太可能出现在我的文件中。
答案1
我认为仅当前面有空格或什么都没有时,您才需要‘
(打开引号) 。'
这也适用于数学模式。
\documentclass{memoir}
\makeatletter
\let\apostrophe'
\catcode`'=\active
\protected\def'{%
\ifvmode
`%
\else
\ifmmode
\expandafter\expandafter\expandafter\active@math@prime % for math
\else
\ifdim\lastskip>0pt
`%
\else
\apostrophe
\fi
\fi
\fi
}
% redefine \pr@m@s to look for an active '
\def\pr@m@s{%
\ifx'\@let@token
\expandafter\pr@@@s
\else
\ifx^\@let@token
\expandafter\expandafter\expandafter\pr@@@t
\else
\egroup
\fi
\fi}
\makeatother
\begin{document}
He said, 'the cats' hats can't fit me'.
'Ouch,' he said.
Some 'derivatives' $f'+f''+f'''$.
\end{document}
请注意,按照您的规范,第二行的逗号后应该有一个打开的引号。
笔记
\protected
被使用或\section{A 'quoted'}
将会失败\section{'quoted'}
将会失败,而且对此没有什么可做的
以下内容似乎可以修复章节和章节标题中出现尾随引号的问题。
两者进行编译pdflatex
,xelatex
结果相同。
\documentclass{memoir}
\usepackage{ifxetex}
\ifxetex
\usepackage{fontspec}
% \setmainfont{Linux Libertine O}
\fi
\makeatletter
% fix latex's habit of resetting ' during \write
\begingroup
\obeylines\obeyspaces%
\catcode`\'\active%
\gdef\@resetactivechars{%
\def^^M{\@activechar@info{EOL}\space}%
\def {\@activechar@info{space}\space}}%
\endgroup
\renewcommand{\cftchapteraftersnumb}{\hskip1sp\relax}
\let\ORIM@sect\M@sect
\def\M@sect#1#2#3#4#5#6[#7][#8]#9{%
\ORIM@sect{#1}{#2}{#3}{#4}{#5}{#6}[\hskip1sp\relax#7][\hskip1sp\relax#8]{\hskip1sp\relax#9}%
}
\catcode`'=\active
\protected\def'{%
\ifvmode
`%
\else
\ifmmode
\expandafter\expandafter\expandafter\active@math@prime % for math
\else
\relax
\ifdim\lastskip=1sp
`%
\else
\ifdim\lastskip>0pt
`%
\else
\rq
\fi
\fi
\fi
\fi
}
% redefine \pr@m@s to look for an active '
\def\pr@m@s{%
\ifx'\@let@token
\expandafter\pr@@@s
\else
\ifx^\@let@token
\expandafter\expandafter\expandafter\pr@@@t
\else
\egroup
\fi
\fi}
\makeatother
\begin{document}
\tableofcontents
\chapter{'Chapter'}
\section{'Quoted'}
He said, 'the cats' hats can't fit me'.
'Ouch,' he said.
Some 'derivatives' $f'+f''+f'''$.
\end{document}
答案2
如果不需要区分撇号和结束引号,那么您可以尝试:
\def\leftquote{`}\def\rightquote{'}
\catcode`\'=13
\def'{\ifvmode\leftquote \else \ifdim\lastskip=0pt \rightquote \else \leftquote\fi\fi}
He said, 'the cats' hats can't fit me'.
如果文档中使用了这样的“双引号”,并且需要对其进行排版,那么可以使用如下定义:
\def\leftqquote{``}\def\rightqqoute{''} % or another definition, can depend on fonts
% put this definition before \catcode`\'=13
\catcode`\"=13
\def"{\bgroup\def"{\rightqqoute\egroup}\leftqquote}
The normal "quotes" are here.
'
编辑:因为在数学模式中有关于的评论,比如`$f'$,所以我在这里添加了此功能:
\def\leftquote{`}\def\rightquote{'}
\catcode`\'=13
\def'{\ifmmode \expandafter\mathprime \else\ifvmode \leftquote \else
\ifdim\lastskip=0pt \rightquote \else \leftquote\fi\fi\fi}
\def\mathprime{^\bgroup\catcode`\'=12 \csname prim@s\endcsname}
与接受的答案不同,我不会重写\pr@m@s
宏,只是将 catcode 临时设置回 12。此解决方案在纯 TeX 和 LaTeX 中都有效,因为\prim@s
两个宏包中都使用了具有相同含义的宏。
答案3
如果我正确理解了您的工作流程,那么看起来 (a) 有一个创建可编译 .tex 文件的过程存在一些问题,并且 (b) 您需要在通过 LaTeX 运行 .tex 文件之前解决这些问题。此外,主要问题似乎是整个 tex 文件中都使用了“愚蠢的”(单)引号,并且您希望找到一种方法将一些单引号字符(又名撇号字符)替换为反引号字符(又名反引号)。您没有明确指出您的文档设置了哪种语言,所以我现在假设它是英语。
如果有问题的撇号字符仅出现在句子中间位置(因此前面有空格字符)而不是出现在行首,我想您可以启动编辑器并将所有实例替换
space-apostrophe
为space-backtick
。如果有问题的撇号字符出现在行首,则需要检查编辑器是否可以执行 的搜索和替换
newline_char-apostrophe
。newline_char-backtick
由于您尚未指出选择哪个编辑器(如果有),因此我无法提供有关如何完成此任务的更具体建议。
警告:这两种方法(以及类似的自动化方法)都将不是如果您的输入文本中有“文学”表达,例如'tis
“它是”的缩写,则会产生正确的结果。(在这种情况下,撇号表示省略,而不是引用的开始,因此撇号应该不是被替换为反引号。)