以下示例显示了使用\b
命令处理“bar-under”重音时出现的问题:它似乎以意想不到的方式与 交互\rowcolor
。取消注释相应的行,该示例还显示了与(对于“cedilla”)和(对于“dot-under”重音)的\renewcommand
不良交互:\c
\d
\documentclass{article}
\usepackage[table]{xcolor}
\newcommand*\CRow[1]{\rowcolor{blue!30}\b#1\\}
%\renewcommand*\CRow[1]{\rowcolor{blue!30}\c#1\\}% uncomment for cedilla
%\renewcommand*\CRow[1]{\rowcolor{blue!30}\d#1\\}% uncomment for dot-under
\begin{document}
\begin{tabular}{c}
\CRow{a}
\CRow{b}
\CRow{c}
\CRow{d}
\CRow{e}
\CRow{f}
\CRow{g}
\CRow{h}
\CRow{i}
\CRow{j}
\CRow{k}
\CRow{l}
\CRow{m}
\CRow{n}
\CRow{o}
\CRow{p}
\CRow{q}
\CRow{r}
\CRow{s}
\CRow{t}
\CRow{u}
\CRow{v}
\CRow{w}
\CRow{x}
\CRow{y}
\CRow{z}
\end{tabular}
\end{document}
输出:
是什么导致了这个问题以及如何避免它?
答案1
正如 egreg 在对 Alan Munn 的回答的评论中指出的那样,该colortbl
包使用\everycr
或更准确地说,使用别名在每个有效\CT@everycr
之后插入特定的标记列表:\cr
\crcr
\let\CT@everycr\everycr
\newtoks\everycr
\CT@everycr{\noalign{\global\let\CT@row@color\relax}\the\everycr}
本质上,这种配置会导致\rowcolor
设置当前行的背景颜色,但不设置后续行的背景颜色。
宏\b
和相关函数基于\ialign
LaTeX 内核中定义的内容:
\def\ialign{\everycr{}\tabskip\z@skip\halign}
显然,\ialign
规定了使用 的情况\everycr
;但是,它并没有规定\CT@everycr
用来代替 的情况\everycr
。
因此,如果\b
、\c
或\d
出现在由 开始的行中,\rowcolor
它们可能会在行结束之前隐式重置背景颜色。您可以通过适当的新列类型来防止这种情况:
\documentclass{article}
\usepackage[table]{xcolor}
\makeatletter
\newcolumntype{-}{%
>{\CT@everycr{}}%
}
\makeatother
\newcommand*{\CRow}[1]{%
\rowcolor{blue!30}\b#1&\c#1&\d#1\\%
}
\begin{document}
\begin{tabular}{-c-c-c}
\CRow{a}
\CRow{b}
\CRow{c}
\CRow{d}
\CRow{e}
\CRow{f}
\CRow{g}
\CRow{h}
\CRow{i}
\CRow{j}
\CRow{k}
\CRow{l}
\CRow{m}
\CRow{n}
\CRow{o}
\CRow{p}
\CRow{q}
\CRow{r}
\CRow{s}
\CRow{t}
\CRow{u}
\CRow{v}
\CRow{w}
\CRow{x}
\CRow{y}
\CRow{z}
\end{tabular}
\end{document}
输出结果为:
答案2
这是部分答案和解决方法。它在某种程度上取决于字体和编码。如果您fontenc
使用 T1 编码加载,并使用\c
一个更正确的字形: ,尽管它对或t
没有影响。以下来自 TeX by Topic 的引述也可能相关(第 47 页)\b
\d
TeX 中不存在真正的下重音符号。它们被实现为低置上重音符号。更正确地处理它们的方法是编写一个宏来测量后续字符,并相应地提高或降低重音符号。
\c
纯 TeX 中的 cedilla 宏 做了类似的事情。但是,它不会降低带有降部字符的重音符号。
但我不确定这与\rowcolor
命令如何交互。
请注意,在 Plain TeX 中如果你执行以下操作:
\setbox0=\hbox{\c c}
\showbox0
你得到:
> \box0=
\hbox(4.30554+1.70137)x4.44444
.\kern 0.0 (for accent)
.\tenrm ^^X
.\kern -4.44444 (for accent)
.\tenrm c
但如果你执行其中一个不起作用的角色,你就会得到:
\setbox0=\hbox{\c t}
\showbox0
> \box0=
\hbox(6.15079+1.70137)x3.8889
.\vbox(6.15079+1.70137)x3.8889
..\hbox(6.15079+0.0)x3.8889
...\glue(\tabskip) 0.0
...\hbox(6.15079+0.0)x3.8889 []
...\glue(\tabskip) 0.0
..\glue(\baselineskip) 0.0
..\hbox(0.0+1.70137)x3.8889
...\glue(\tabskip) 0.0
...\hbox(0.0+1.70137)x3.8889, glue set 999.72223fill []
...\glue(\tabskip) 0.0
作为一种解决方法,您可以使用 XeLaTeX(由于某种原因,不适用于 LuaLaTeX)。但是,效果仍然取决于字体。如果您只是将默认字体与 XeLaTeX(Latin Modern)一起使用,您将获得与使用 pdfLaTeX 时不同的效果:所有单元格都不是黑色的,但一些字形完全缺失(b、h、k、l、n、r 和 z)。非常奇怪。但是请注意,这些字形在下面的 XeLaTeX 输出中也显示了略小的下划线。我不认为这是偶然的。
% !TEX TS-program = XeLaTeX
\documentclass{article}
\usepackage[table]{xcolor}
\usepackage{fontspec}
\setmainfont[Ligatures=TeX]{Linux Libertine}
\newcommand*\CRow[1]{\rowcolor{blue!30}\b#1\\}
%\renewcommand*\CRow[1]{\rowcolor{blue!30}\c#1\\}% uncomment for cedilla
%\renewcommand*\CRow[1]{\rowcolor{blue!30}\d#1\\}% uncomment for dot-under
\begin{document}
\begin{tabular}{c}
\CRow{a}
\CRow{b}
\CRow{c}
\CRow{d}
\CRow{e}
\CRow{f}
\CRow{g}
\CRow{h}
\CRow{i}
\CRow{j}
\CRow{k}
\CRow{l}
\CRow{m}
\CRow{n}
\CRow{o}
\CRow{p}
\CRow{q}
\CRow{r}
\CRow{s}
\CRow{t}
\CRow{u}
\CRow{v}
\CRow{w}
\CRow{x}
\CRow{y}
\CRow{z}
\end{tabular}
\end{document}
或者,您可以使用该tipa
包(不带 XeLaTeX)并使用\textipa{\b a}
等。