自动将撇号改为引号

自动将撇号改为引号

这边还有一些其他问题涉及相关问题,但我没有找到任何问题能够准确解决我的问题。

我有一段文本(从 XML 转换而来),其中的撇号'有三种不同的含义:引文开头、引文结尾以及缩写和属格(can'tcats'等)。有没有办法让撇号保持'原样?除了开头的引号之外的所有情况,其中必须将其替换为“?”。供您参考,我实际上在原始文档中使用了 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'}将会失败,而且对此没有什么可做的

以下内容似乎可以修复章节和章节标题中出现尾随引号的问题。

两者进行编译pdflatexxelatex结果相同。

\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-apostrophespace-backtick

  • 如果有问题的撇号字符出现在行首,则需要检查编辑器是否可以执行 的搜索和替换newline_char-apostrophenewline_char-backtick由于您尚未指出选择哪个编辑器(如果有),因此我无法提供有关如何完成此任务的更具体建议。

警告:这两种方法(以及类似的自动化方法)都将不是如果您的输入文本中有“文学”表达,例如'tis“它是”的缩写,则会产生正确的结果。(在这种情况下,撇号表示省略,而不是引用的开始,因此撇号应该不是被替换为反引号。)

相关内容