“下面”重音和 \rowcolor 的奇怪行为

“下面”重音和 \rowcolor 的奇怪行为

以下示例显示了使用\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和相关函数基于\ialignLaTeX 内核中定义的内容:

\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}等。

相关内容