![命令 \texteuro 在编码 T1 中不可用](https://linux22.com/image/294473/%E5%91%BD%E4%BB%A4%20%5Ctexteuro%20%E5%9C%A8%E7%BC%96%E7%A0%81%20T1%20%E4%B8%AD%E4%B8%8D%E5%8F%AF%E7%94%A8.png)
我想知道 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
将utf8
Unicode字符€
映射到\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}\!\!\!\!\!\!=}}