LuaLaTeX 和 XeLaTex 中的软连字符 (U+00AD) 的 UTF-8 问题

LuaLaTeX 和 XeLaTex 中的软连字符 (U+00AD) 的 UTF-8 问题

我有一个非常简单的测试用例,它显示所有 Latin-1 可打印字符(U+0021- U+007eU+00A1- U+00ff)。它对除 之外的每个 UTF-8 字符都能正常工作U+00AD。它在 LuaLaTeX 和 XeLaTex 上都失败了。

我使用 或设置等宽字体都没有关系unicode-math。如果我在记事本中打开源文件,无论我选择哪种字体(只要字体支持 Latin-1),所有内容都会正确显示。如果我使用 setmonofont 设置字体,则没有任何区别。

以下是测试用例:

\documentclass[10pt]{article}
\begin{document}
\begin{verbatim}
! " # $ % & ' ( ) * + , - . /
0 1 2 3 4 5 6 7 8 9 : ; < = > ?
@ A B C D E F G H I J K L M N O
P Q R S T U V W X Y Z [ \ ] ^ _
` a b c d e f g h i j k l m n o
p q r s t u v w x y z { | } ~

¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯
° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿
À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï
Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß
à á â ã ä å æ ç è é ê ë ì í î ï
ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ
\end{verbatim}
\end{document}

这在问题中显示不正确,因此源图像也包含在等宽字体中。

示例测试代码

这是输出。可以看出,在 ASCII 范围上方的第一行(从倒置的 ! 开始),在“not”符号后面,连字符被省略了。这在非逐字模式下可能是正确的,因为如果它嵌入在单词中,它就是一个“弱”连字符。但是,这种处理不应该在逐字模式下发生。请注意,当不处于逐字模式时,它也会失败,并且由于弱连字符没有嵌入在单词中,因此不应将其省略(如记事本所示)。

测试输出

答案1

记事本显示的内容不应视为绝对规则。例如,我机器上的编辑器不显示 U+00AD。

在此处输入图片描述

即使我要求显示隐形字符也不行

在此处输入图片描述

但是,您可能决定显示里面的角色verbatim,这并不难:在启动时挂入代码以添加您的个人资料verbatim

\documentclass[10pt]{article}
\usepackage{etoolbox}

\makeatletter
\patchcmd{\@verbatim}{\@noligs}{\@noligs\@otherstuff}{}{}
\def\@otherstuff{\catcode"AD=\active}
\begingroup
\catcode"AD=\active
\gdef^^ad{{\ooalign{-\cr\hidewidth?\hidewidth\cr}}}
\endgroup


\begin{document}
\begin{verbatim}
  ! " # $ % & ' ( ) * + , - . /
0 1 2 3 4 5 6 7 8 9 : ; < = > ?
@ A B C D E F G H I J K L M N O
P Q R S T U V W X Y Z [ \ ] ^ _
` a b c d e f g h i j k l m n o
p q r s t u v w x y z { | } ~

  ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯
° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿
À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï
Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß
à á â ã ä å æ ç è é ê ë ì í î ï
ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ
\end{verbatim}
\end{document}

在此处输入图片描述

决定外观,这里将问号叠加在连字符上。

答案2

这是预期的行为。记事本可能会将字符显示为连字符,但我的编辑器却不会:它显示<0xad>为表示不可打印的字符。

您会看到,早在 2002 年 Unicode 4.0 首次发布时,U+00AD软连字符 (SOFT HYPHEN) 的类别就从之前的“Pd”(标点符号、破折号)更改为“Cf”(其他、格式),遵循 HTML 4.0 的做法,其&shy;行为一直都是这样的。

这意味着这个角色的唯一目的是标记一个隐形连字机会,只有在需要时,格式化后才会在行尾显示连字符。实际上\-,所有情况都与 TeX 类似。

在此处输入图片描述

答案3

正则表达式可以找到格式字符并将其替换为可见的内容:

现在可见

平均能量损失

\documentclass{article}
\usepackage{xparse}
\usepackage{xcolor}

\ExplSyntaxOn

\NewDocumentCommand { \showAD } { +m } {
    \tl_set:Nn \l_tmpa_tl { #1 }
    \regex_replace_all:nnN 
                { \xAD } 
                { \cB\{ \c{color} \cB\{ red \cE\} A \cE\} \c{llap}\cB\{ D \cE\} } 
                \l_tmpa_tl
    \tl_use:N \l_tmpa_tl
}
                        
\ExplSyntaxOff

\begin{document}

abc­xyz (invisible)

\showAD{abc­xyz} (visible)

\ttfamily
\showAD{¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯}

\end{document}

相关内容