命令 \texteuro 在编码 T1 中不可用

命令 \texteuro 在编码 T1 中不可用

我想知道 LaTeX 如何确定欧元符号 (€) 是否是给定 T1 字体的字形。我试过了,\iffontchar但似乎值不是唯一的。据我所知,它不是 256 个字符的标准符号,所以我对算法很感兴趣。

请注意:我不是如果我的字体没有字形,我有兴趣使用 € 符号。我只想捕捉错误并使其放松或重新定义字体中没有的字形。我也不是对使用 opentype 字体感兴趣。

该答案也适用于 PDFLaTeX、LuaLaTeX 和 XeLaTeX。

当我遇到这个问题时,以下是我所写的:

\documentclass[11pt,a4paper]{article}
\usepackage{iftex}
\ifPDFTeX
    \input glyphtounicode
    \pdfgentounicode=1
    \usepackage[utf8]{inputenc}
\else
    \ifLuaTeX
        \input glyphtounicode
        \pdfgentounicode=1
        \usepackage[utf8]{luainputenc}
    \else
        \ifXeTeX %XeTeX T1 german special char fix
            \usepackage{newunicodechar}
            \newunicodechar{ß}{\ss}
            \newunicodechar{ä}{\"{a}}
            \newunicodechar{ü}{\"{u}}
            \newunicodechar{ö}{\"{o}}
            \newunicodechar{Ä}{\"{A}}
            \newunicodechar{Ü}{\"{U}}
            \newunicodechar{Ö}{\"{O}}
            \newunicodechar{§}{\textsection}% I think it's okay because standard character... but
            %\newunicodechar{€}{here it should check if eurosymbol in t1 font and if not let him relax (print nothing)}
            \renewcommand{\SS}{\iffontchar\font"1E9E \symbol{"1E9E}\else SS\fi}
        \fi
    \fi
\fi
\usepackage[ngerman]{babel}
\usepackage[left=3.5cm,right=3cm,bottom=3.5cm]{geometry}
\usepackage[default,t1,osf,semibold]{raleway}
\usepackage{microtype}
\begin{document}
Office 0123456789 äüöÄÜÖß \texteuro € \textmu
\end{document}

更新 使用textcomp包可以工作并从字体中获取未伪造的字形。所以这个问题解决了。但我仍然对如何为%\newunicodechar{€}{}没有特殊字母的字体定义感兴趣。

答案1

utf8Unicode字符映射到\texteuro,这需要textcomp。的定义\texteuro

\DeclareTextCommandDefault{\texteuro}
   {\CheckEncodingSubset\UseTextSymbol{TS1}\tc@fake@euro5\texteuro}

如果已知当前系列的 TS1 字体没有欧元符号(即属于第 5 类),则使用 来伪造字形\tc@fake@euro。如果您想要引发错误,只需更改此宏的定义:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{textcomp}

\makeatletter
\def\tc@fake@euro#1{%
  \@latex@error{No \noexpand#1in family \f@family}{}%
}
\makeatother

\begin{document}
X€X

\fontfamily{put}\selectfont % put belongs to class 5
X€X
\end{document}

这将发布

! LaTeX Error: No \texteuro in family put.

并且不会打印任何字形。您可以将其定义为使用其他字体的字形,例如

\def\tc@fake@euro#1{{%
  \fontencoding{TS1}\fontfamily{lmr}\selectfont\symbol{191}%
}}

请注意,基于的测试\iffontchar\font191不会成功,因为通常使用构建的字体fontinst会用黑色方块表示不存在的字符。因此,textcomp根据内部数据库来决定是否伪造字形。


顺便说一句,\iffontchar\font"1E9E如果使用八位 TeX 字体则会返回 false,因此这是一个相当无用的测试。

答案2

LaTeX 不需要检查任何内容,T1 编码在定义上不包括欧元。它位于 TS1 编码中(由 所用textcomp),当然也位于 lua 和 xe latex 所用的 EU1 和 EU2 编码中。

答案3

如果其他所有方法都失败了,您可以尝试伪造欧元符号。这个解决方案可能看起来不太好,但它随时有效:

\newcommand{\euro}{{\mathrm{C}\!\!\!\!\!\!=}} 

相关内容