重述问题和解决方案
如果使用该包中的 times 字体时txfonts
使用了诸如 ę、ą 之类的字符或带有 ogonek 的其他字符,则会导致表格显示不正确(见下文的图片)。
这与所涉及的程序不是局部的有关,也就是说,在其他地方会产生不良的副作用。
将所做的任何操作保持在本地的有效方法是将其括在括号中{ę}
。通常可以通过以下方式在序言中映射ę
到{ę}
、a
到{ą}
等来调用任何提到相关字符的方法:
\DeclareUnicodeCharacter {281}{{ę}} % 281 is the decimal utf-8 code of ę
...
这将解决整个文档的问题
下文标题“解决方法”下介绍了一种更通用的解决方案,可以修复源文件中引入的错误txfonts
。但是,如果您不想摆弄包的调用方式(可能是因为它在您不想更改的样式表中被调用),重新定义字符是一个很好的解决方案
最初的问题
我正在使用 (MikTeX,所有软件包都是最新的) 排版一份多语言文档pdflatex
。我需要使用 Times 字体,而且目前我无法切换到 LuaLatex 或 XeLatex,因为我正处于使用出版商提供的课程排版书籍的最后阶段,我需要调整我的代码才能使用上述这些。
使用波兰字符会txfonts
导致表格崩溃:
\documentclass{article}
\usepackage{txfonts}
%\usepackage{mathptmx}
\usepackage[polish, english]{babel}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\newcommand{\ee}{\selectlanguage{english}\fontencoding{T1}}
\newcommand{\pl}{\selectlanguage{polish}\fontencoding{T1}}
\begin{document}
\textbf{A minimal example using a times font}
As soon as I enter the Polish character \pl ę \ee the tables crash
(the lines of the table get printed onto each other).
\begin{table}\begin{center}\begin{tabular}{|l||l|l|}
\hline
type&n &rel \\
\hline
\hline
One line in the table &260& many \\
Another line in the table &792&49 \\
A third line in the table &288&1 \\
\hline
\end{tabular}\end{center}\caption{A test table.}\end{table}
\end{document}
替代包mathptmx
不会导致此问题;但是,它不提供我需要的希腊字符。以下最小示例说明了这一点:
\documentclass{article}
%\usepackage{mathptmx}
\usepackage{txfontsb}
\usepackage[polutonikogreek,polish, english]{babel}
\usepackage[utf8x]{inputenc}
\usepackage[LGR,T1]{fontenc}
\newcommand{\ee}{\selectlanguage{english}\fontencoding{T1}}
\newcommand{\grrk}{\selectlanguage{polutonikogreek}\fontencoding{LGR}}
\begin{document}
\textbf{A minimal example using a times font}
I need to print polytonic Greek (and other special characters) using a
times font (e.g. \grrk ἐᾶν \textbf{ἐᾶν})! \ee
I use the \emph{txfonts} (or \emph{txfontsb}) package,
the alternative \emph{mathptmx} cannot find the metric files (``Couldn't find `grtm.cfg''').
\end{document}
我该如何使用txfonts
并防止表格崩溃?我也试过了txfontsb
!
更新:我现在明白了,这与波兰语无关,它是ę 中的变音符号(奥戈内克) 会导致此问题。以下代码中也出现了同样的问题,其中 m 上有 ogonek:
\documentclass{article}
\usepackage{txfonts}
\usepackage[T1]{fontenc}
\begin{document}
text with ogonek: \k{m}
\begin{table}\begin{center}\begin{tabular}{|l||l|l|}
\hline
type&n &rel \\
\hline
\hline
One line in the table &260& many \\
Another line &792&49 \\
A third line in the table &288&1 \\
\hline
\end{tabular}\end{center}\caption{A test table.}\end{table}
\end{document}
如果\k{m}
用括号括起来,表格就可以正常工作。因此,这与位置以及应用 ogonek 的{\k{m}}
方式有关。txfonts
答案1
最短的修复方法:使用括号括起来 ę:
\pl {ę} \ee
对于较长的文本,您可以使用otherlanguage
环境,而不是切换\selectlanguage
到波兰语并切换回英语:
\begin{otherlanguage}{polish}
ę
\end{otherlanguage}
之前以\pl ę \ee
(\selectlanguage
)为例:
之后,使用大括号或otherlanguage
:
答案2
\selectlanguage{<language>}
在段落中间说这些并不是一个好主意,因为这个命令会执行许多操作,在分页符的情况下会产生不可预测的结果,并且正如您所经历的,在其他情况下也是如此。
对于其他语言的简短插页,请使用
\foreignlanguage{polish}{ę}
对于较长的段落,你可以选择
\begin{otherlanguage*}{polish}
...
\end{otherlanguage*}
和
\begin{otherlanguage}{polish}
...
\end{otherlanguage}
区别在于前者不改变固定单词(章节名称等),而后者会改变。两者都会改变连字和语言快捷键的设置。
实际上没有必要写\foreignlanguage{polish}{<polish passage>}
:
\newcommand{\pl}[1]{\foreignlanguage{polish}{#1}}
使语法可用\pl{polish passage}
。
解决方法
有一个悲剧性的错误,txfonts.sty
其中\k
以错误的方式重新定义:\ooalign
宏没有用括号保护,因此,只要在外部组级别使用带有 ogonek 的字母,设置\lineskiplimit=-\maxdimen
就会变为全局的。
可以使用以下方法纠正
\makeatletter
\AtBeginDocument{\let\T@n@@nc@d@ngM@cr@M@d\relax}
\makeatother
\usepackage{txfonts}
这样可以避免错误的重新定义,因此不需要其他技巧,因为 的定义\k
将保持为 fontenc 包发出的正确定义。但是,更好的加载顺序应该是
\usepackage[T1]{fontenc}
\usepackage[utf8x]{inputenc}
\usepackage[polish,english]{babel}
\makeatletter
\AtBeginDocument{\let\T@n@@nc@d@ngM@cr@M@d\relax}
\makeatother
\usepackage{txfonts}
一个更清晰的解决方案可能是编写一个“更正包”,fixtxfonts.sty
比如说
\ProvidesPackage{fixtxfonts}
\AtEndOfPackage{%
\let\T@n@@nc@d@ngM@cr@M@d\relax
\DeclareTextCommand{\k}{LY1}[1]{{\ooalign{\hidewidth\char7\crcr#1}}}%
}
\RequirePackage{txfonts}
并说\usepackage{fixtxfonts}
而不是\usepackage{txfonts}