![有没有(更好的)方法可以在 paracol 环境中反复切换两种字体颜色,并使用 XeTeX 进行编译?](https://linux22.com/image/451737/%E6%9C%89%E6%B2%A1%E6%9C%89%EF%BC%88%E6%9B%B4%E5%A5%BD%E7%9A%84%EF%BC%89%E6%96%B9%E6%B3%95%E5%8F%AF%E4%BB%A5%E5%9C%A8%20paracol%20%E7%8E%AF%E5%A2%83%E4%B8%AD%E5%8F%8D%E5%A4%8D%E5%88%87%E6%8D%A2%E4%B8%A4%E7%A7%8D%E5%AD%97%E4%BD%93%E9%A2%9C%E8%89%B2%EF%BC%8C%E5%B9%B6%E4%BD%BF%E7%94%A8%20XeTeX%20%E8%BF%9B%E8%A1%8C%E7%BC%96%E8%AF%91%EF%BC%9F.png)
\documentclass{article}
\usepackage{xeCJK}
\usepackage{xcolor}
\colorlet{color1}{blue!50!black}
\colorlet{color2}{green!50!black}
\usepackage{etoolbox}
\newtoggle{col}
\providecommand{\tog}%
{%
\iftoggle{col}%
{\color{color1}\togglefalse{col}}%
{\color{color2}\toggletrue{col}}%
}%
\usepackage{paracol}
\maxdeadcycles=10000
\begin{document}
\begin{paracol}{1}
\tog a\tog b\tog c\tog d\tog e\tog f\tog g\tog h\tog i\tog j\tog k\tog l\tog m\tog n\tog o\tog p\tog q\tog r\tog s\tog t\tog u\tog v\tog w\tog x\tog y\tog z
\tog a\tog b\tog c\tog d\tog e\tog f\tog g\tog h\tog i\tog j\tog k\tog l\tog m\tog n\tog o\tog p\tog q\tog r\tog s\tog t\tog u\tog v\tog w\tog x\tog y\tog z
\tog a\tog b\tog c\tog d\tog e\tog f\tog g\tog h\tog i\tog j\tog k\tog l\tog m\tog n\tog o\tog p\tog q\tog r\tog s\tog t\tog u\tog v\tog w\tog x\tog y\tog z
\tog a\tog b\tog c\tog d\tog e\tog f\tog g\tog h\tog i\tog j\tog k\tog l\tog m\tog n\tog o\tog p\tog q\tog r\tog s\tog t\tog u\tog v\tog w\tog x\tog y\tog z
\tog a\tog b\tog c\tog d\tog e\tog f\tog g\tog h\tog i\tog j\tog k\tog l\tog m\tog n\tog o\tog p\tog q\tog r\tog s\tog t\tog u\tog v\tog w\tog x\tog y\tog z
\tog a\tog b\tog c\tog d\tog e\tog f\tog g\tog h\tog i\tog j\tog k\tog l\tog m\tog n\tog o\tog p\tog q\tog r\tog s\tog t\tog u\tog v\tog w\tog x\tog y\tog z
\end{paracol}
\end{document}
我正在用中文写文档,并使用 XeTeX 编译并获取中文字体。我还用它paracol
来添加边注。我编写了一个\tog
切换字体颜色的函数,目的是突出显示中文单词边界。为了方便编辑,我想使用一个在两种颜色之间切换的命令,而不是明确说明颜色(否则如果我删除一个单词,那么我需要更改整个文档的颜色)。
我必须首先克服这个问题通过添加\maxdeadcycles=10000
,但即使这样,过了一段时间后它基本上就放弃了:
一定有更好的方法。我只想在出现时切换字体颜色\tog
(我需要调用数千次);这应该不会太难。
问题:有没有(更好的)方法可以在 paracol 环境中反复切换两种字体颜色,并使用 XeTeX 进行编译?
答案1
出现此错误是因为同一环境中的颜色变化过多超出了 XeTeX 颜色堆栈的容量。您的错误是字面上的堆栈溢出。
在 XeTeX 中解决这个问题的一种方法是将每次颜色变化都放在一个\textcolor
命令中,这样每次颜色变化都会持续很短的时间,然后在下一次变化之前结束。然后 XeTeX 不会尝试记住环境结束前的所有颜色变化,以便在需要时可以撤消所有颜色变化,这会让一切都变得混乱。
\documentclass{article}
\usepackage{xeCJK}
\usepackage{xcolor}
\colorlet{color1}{blue!50!black}
\colorlet{color2}{green!50!black}
\usepackage{etoolbox}
\newtoggle{col}
\providecommand{\tog}[1]%
{%
\iftoggle{col}%
{\textcolor{color1}{#1}\togglefalse{col}}%
{\textcolor{color2}{#1}\toggletrue{col}}%
}%
\usepackage{paracol}
\maxdeadcycles=10000
\begin{document}
\begin{paracol}{1}
\tog a\tog b\tog c\tog d\tog e\tog f\tog g\tog h\tog i\tog j\tog k\tog l\tog m\tog n\tog o\tog p\tog q\tog r\tog s\tog t\tog u\tog v\tog w\tog x\tog y\tog z
\tog a\tog b\tog c\tog d\tog e\tog f\tog g\tog h\tog i\tog j\tog k\tog l\tog m\tog n\tog o\tog p\tog q\tog r\tog s\tog t\tog u\tog v\tog w\tog x\tog y\tog z
\tog a\tog b\tog c\tog d\tog e\tog f\tog g\tog h\tog i\tog j\tog k\tog l\tog m\tog n\tog o\tog p\tog q\tog r\tog s\tog t\tog u\tog v\tog w\tog x\tog y\tog z
\tog a\tog b\tog c\tog d\tog e\tog f\tog g\tog h\tog i\tog j\tog k\tog l\tog m\tog n\tog o\tog p\tog q\tog r\tog s\tog t\tog u\tog v\tog w\tog x\tog y\tog z
\tog a\tog b\tog c\tog d\tog e\tog f\tog g\tog h\tog i\tog j\tog k\tog l\tog m\tog n\tog o\tog p\tog q\tog r\tog s\tog t\tog u\tog v\tog w\tog x\tog y\tog z
\tog a\tog b\tog c\tog d\tog e\tog f\tog g\tog h\tog i\tog j\tog k\tog l\tog m\tog n\tog o\tog p\tog q\tog r\tog s\tog t\tog u\tog v\tog w\tog x\tog y\tog z
\end{paracol}
\end{document}
尽管你可能会写一些更类似的东西\tog{uvw}\tog{xy}
。我只是在不需要的时候没有重写整个 MWE。
此外,如果您的颜色变化确实如此有规律,那么您可以在循环内进行这些变化。
答案2
@Fran 的想法很好。
基于如何使用lualatex来使用中文?,luatexja 是一个选项。
[文本 - 维基百科 - 太阳系]
平均能量损失
\documentclass{article}
%\usepackage{xeCJK}
\usepackage{luatexja-fontspec}
\setmainjfont{FandolSong}
\usepackage{xcolor}
\colorlet{color1}{blue}
\colorlet{color2}{red}
\usepackage{etoolbox}
\newtoggle{col}
\newcommand{\tog}%
{%
\iftoggle{col}%
{\color{color1}\togglefalse{col}}%
{\color{color2}\toggletrue{col}}%
}%
%to save typing:
\newcommand{\北}{\tog}
\catcode`\⛯=\active %arbitrary symbol as shortcut
\def⛯{\北}
\usepackage{paracol}
\begin{document}
\begin{paracol}{1}
\tog a\tog b\tog c\tog d\tog e\tog f\tog g\tog h\tog i\tog j\tog k\tog l\tog m\tog n\tog o\tog p\tog q\tog r\tog s\tog t\tog u\tog v\tog w\tog x\tog y\tog z
\tog a\tog b\tog c\tog d\tog e\tog f\tog g\tog h\tog i\tog j\tog k\tog l\tog m\tog n\tog o\tog p\tog q\tog r\tog s\tog t\tog u\tog v\tog w\tog x\tog y\tog z
\tog a\tog b\tog c\tog d\tog e\tog f\tog g\tog h\tog i\tog j\tog k\tog l\tog m\tog n\tog o\tog p\tog q\tog r\tog s\tog t\tog u\tog v\tog w\tog x\tog y\tog z
\tog a\tog b\tog c\tog d\tog e\tog f\tog g\tog h\tog i\tog j\tog k\tog l\tog m\tog n\tog o\tog p\tog q\tog r\tog s\tog t\tog u\tog v\tog w\tog x\tog y\tog z
\tog a\tog b\tog c\tog d\tog e\tog f\tog g\tog h\tog i\tog j\tog k\tog l\tog m\tog n\tog o\tog p\tog q\tog r\tog s\tog t\tog u\tog v\tog w\tog x\tog y\tog z
\tog a\tog b\tog c\tog d\tog e\tog f\tog g\tog h\tog i\tog j\tog k\tog l\tog m\tog n\tog o\tog p\tog q\tog r\tog s\tog t\tog u\tog v\tog w\tog x\tog y\tog z
⛯太陽系⛯是⛯一个⛯受太⛯阳引力约⛯束在⛯一起⛯的⛯行星系统
\北 太陽系\北 是\北 一个⛯受太⛯阳引力约⛯束在⛯一起⛯的⛯行星系统,包括⛯太⛯阳⛯以⛯及⛯直⛯接⛯或⛯间⛯接⛯围⛯绕⛯太⛯阳⛯运⛯动⛯的⛯天⛯体[a]。etc ... 在直接围绕太阳运动的天体中,最大的八颗被称为行星[b],其余的天体要比行星小很多,比如矮行星、太阳系小行星和彗星。軌道間接围绕太陽运动的天體是衛星,其中有兩顆比最小的行星水星還要大[c]。
\end{paracol}
\end{document}