luatex nodelib color_stack 不适用于整个数学方程式

luatex nodelib color_stack 不适用于整个数学方程式

当我使用 post_linebreak_filter 更改 hlist 的颜色时,一些方程式只有部分颜色!这是示例的图像和完整代码。如下所示,水平分割线仍然是黑色的……

在此处输入图片描述


\documentclass[notitlepage,letterpaper]{article}

%\usepackage{lua-visual-debug}
\usepackage[absolute]{textpos}
\usepackage[letterpaper,left=2in,right=2in,top=1in,bottom=0in]{geometry}
\usepackage[expansion=alltext,shrink=20,stretch=20]{microtype}
\usepackage{fontspec}
\usepackage{unicode-math}
\setmainfont{TeX Gyre Pagella}
\setmathfont{TeX Gyre Pagella Math}
\usepackage{blindtext}

\directlua{
    function my_post_lb_filter(head,groupcode)
      local HLIST = node.id("hlist")
      local WHAT = node.id("whatsit")
      local COL = node.subtype("pdf_colorstack")
      local color_push = node.new(WHAT,COL)
      local color_pop = node.new(WHAT,COL)
      color_push.stack = 0
      color_pop.stack = 0
      color_push.data = "1 0 0 rg"
      color_push.command = 1
      color_pop.command = 2
      for n in node.traverse(head) do % For every subnode within node head
        if n.id==HLIST then % If its a line of text
          n.head = node.insert_before(n.list, n.head, node.copy(color_push))
          n.head = node.insert_after(n.list, node.tail(n.head), node.copy(color_pop))
        end
      end
      return head
    end
  luatexbase.add_to_callback('post_linebreak_filter', my_post_lb_filter, 'Play with luatex node library')
}

\begin{document}

\blindtext[1]\vspace*{\baselineskip}

$\displaystyle\int_a^b x^2\;\mathrm{d}x= \tfrac{1}{3} x^3 \Big|_a^b$\vspace*{\baselineskip}

\blindtext[1]\vspace*{\baselineskip}

$a_0+\cfrac{1}{a_1+\cfrac{1}{a_2+\cfrac{1}{a_3+\cdots}}}$\vspace*{\baselineskip}


\end{document}

答案1

这是一个典型的问题,最小例子可以帮助您缩小问题范围:

\documentclass{article}
\begin{document}
\showoutput

\pdfextension colorstack 0 push {0.5 0.2 0.3 rg}

$\frac ab$

\end{document}

在此处输入图片描述

这表明它与 Lua 代码完全无关。这引出了一个重要的问题:它在0.5 0.2 0.3 rg做什么?它是一个 PDF 文字,所以我们必须在 PDF 规范中查找它。PDF 规范 v1.7,附录 A(操作符摘要)中提到rg

rg setrgbcolor“设置 RGB 颜色非抚摸运营”

默认情况下,绘制字符是非描边操作(字符轮廓是填充的,而不是描边),但可以通过描边操作绘制(如果描边不是太粗)。那么我们如何更改描边操作的颜色呢?

RG setrgbcolor“为描边操作设置 RGB 颜色”

为了确保颜色一致,在 LaTeX 中通常将描边颜色和非描边颜色一起设置:

\documentclass{article}
\begin{document}
\showoutput

\pdfextension colorstack 0 push {0.5 0.2 0.3 rg 0.5 0.2 0.3 RG}

$\frac ab$

\end{document}

在此处输入图片描述

相关内容