Spacefactor 和 Unicode 花括号

Spacefactor 和 Unicode 花括号

Unicode 大括号似乎没有正确的空格因子。考虑以下最小示例 (不是使用法语间距):

\documentclass[12pt]{minimal}
\usepackage[utf8]{inputenc} % Or fontspec with XeLaTeX/LuaLaTeX
\begin{document}

Compare:

``Is the spacing correct?\@'' he asked. % Yes, as it should be

``Is the spacing correct?'' he asked.   % No, as it should be

“Is the spacing correct?\@” he asked.   % Yes…

“Is the spacing correct?” he asked.     % Yes -- but it shouldn’t be
\end{document}

有没有办法——无论是在 PDFLaTeX 还是 XeLaTeX/LuaLaTeX 中——为 Unicode 花引号赋予与直引号相同的空间因子(sfcode 0)?

答案1

结束的双引号位于"22OT1 编码中的位置和"11T1 编码中的位置。

所以

\sfcode"22=0

或者

\sfcode"11=0

根据所选的编码即可。如果您想要一个独立于编码(OT1 或 T1)设置空间因子代码的魔法,那么

\AtBeginDocument{
  \sfcode\csname\encodingdefault\string\textquotedblright\endcsname=0
}

就是你要找的。这是测试文档:

\documentclass[12pt]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc} % Or fontspec with XeLaTeX/LuaLaTeX

\AtBeginDocument{
  \sfcode\csname\encodingdefault\string\textquotedblright\endcsname=0
}

\begin{document}

Compare:

``Is the spacing correct?\@'' he asked.

``Is the spacing correct?'' he asked.

“Is the spacing correct?\@” he asked.

“Is the spacing correct?” he asked.
\end{document}

无论有没有该fontenc线,输出都是相同的。

对于 XeLaTeX/LuaLaTeX,设置\sfcode`”=0是正确的。


让我们来看看 的情况。在和pdflatex中找到的定义(在加载 OT1 或 T1 编码时加载)是ts1enc.dfut1enc.dfu

\DeclareUnicodeCharacter{201D}{\textquotedblright}

\textquotedblright根据编码的不同,其含义会发生变化。对于 OT1,它是“排版位置为 的字符"22”,相当于\";但对于 T1,它是位置为 的字符"11。这可以通过以下方式声明

\sfcode`\^^Q=0

但必须给出不同的定义,这很不方便。幸运的是,这个神秘的指令

\sfcode\csname\encodingdefault\string\textquotedblright\endcsname=0

精确访问\OT1\textquotedblright\T1\textquotedblright,这是右插槽的符号名称,取决于默认编码。

答案2

是的,我编辑的命令找到\sfcode了答案的一半。在 XeLaTeX/LuaLaTeX 下,花括号字符可以像任何其他字符一样设置其空间因子代码。在 PDFLaTex 下,U+201D重定向到直双引号",可以设置其 sfcode。

\documentclass[12pt]{minimal}

\usepackage{ifluatex, ifxetex}
\newif\ifmoderntex
\ifluatex   \moderntextrue  \fi
\ifxetex    \moderntextrue  \fi

\ifmoderntex
    \usepackage{fontspec}
    \setmainfont[Ligatures=TeX]{Constantia}
    \sfcode`\”0
\else
    \usepackage[utf8]{inputenc}
    \sfcode`\"0
\fi

\begin{document}

Compare:

``Is the spacing correct?\@'' he asked. % Yes, correctly

``Is the spacing correct?'' he asked.   % No, correctly

“Is the spacing correct?\@” he asked.   % Yes, correctly

“Is the spacing correct?” he asked.     % No, correctly

\end{document}

相关内容