软件包 luacolor 禁用 chickenize

软件包 luacolor 禁用 chickenize

我真的很想通过用彩虹色打印一个单词来吸引读者的注意力。通常使用chickenize包就可以做到这一点。MWE:

\documentclass{article}

\usepackage{chickenize}
\usepackage{fontspec}
\usepackage{blindtext}

\begin{document}

\rainbowcolor

\blindtext

\end{document}
% Local Variables:
% TeX-engine: luatex
% End:

结果: 彩虹色文本

但如果我添加\usepackage{luacolor},打印结果将仅为黑色。添加 luacolor 包会禁用 chickenize。

我正在处理一个较大的文档,即使我没有 luacolor,彩虹色也无法正常工作。搜索 MWE 后,我发现 luacolor 是罪魁祸首,但可能还有更多。

问题 1:什么导致 Chickenize 失效?

我注意到有时文档的生成者是“LuaTeX-1.18.0”,有时是“luahbtex-1.18.0”。但我找不到哪个命令指向哪个引擎的开关。

问题 2:如果您能指出一些描述机制的文档,那么如何获取哪个生产商的资料。

答案1

问题 1

luacolor设置一个名为LuaCol@Attribute所有节点的属性,并根据该属性的值,它将在出口时间来确保节点的颜色正确。

在您的示例中,所有字形节点LuaCol@Attribute的值都是 1,因此将luacolor它们着色为黑色出口时间,在这种情况下对应的颜色。

由于chickenize在 TeX 将段落分成行之后(在post_linebreak_filter回调时)添加颜色数据,并且它发生在输出之前,因此luacolor获胜。

您可以通过取消设置来解决此问题 LuaCol@Attribute(您可能应该在本地执行此操作):

\documentclass{article}
\usepackage{luacolor}
\usepackage{chickenize}
\usepackage{fontspec}
\usepackage{blindtext}
\makeatletter
\newcommand\foo[1]{{\rainbowcolor\unsetattribute\LuaCol@Attribute #1}}
\makeatother
\begin{document}
\foo\blindtext
\end{document}

在此处输入图片描述 或者更好的是,使用与以下内容兼容的代码luacolor

\documentclass{article}
\usepackage{luacolor}
\usepackage{blindtext}
\directlua{
luatexbase.new_attribute"rainbow"
local setattribute = tex.setattribute
local traverse_id = node.traverse_id
local has_attribute = node.has_attribute
local set_attribute = node.set_attribute
local scan_keyword = token.scan_keyword
local scan_real = token.scan_real
local rainbow_step = 0.005
local rainbow_Rgb = 0.995 
local rainbow_rGb = 0.005   
local rainbow_rgB = 0.005
local rainind = 1          

local function rainbow_color()
    if rainind == 1 then
      rainbow_rGb = rainbow_rGb + rainbow_step
      if rainbow_rGb >= 1-rainbow_step then rainind = 2 end
    elseif rainind == 2 then
      rainbow_Rgb = rainbow_Rgb - rainbow_step
      if rainbow_Rgb <= rainbow_step then rainind = 3 end
    elseif rainind == 3 then
      rainbow_rgB = rainbow_rgB + rainbow_step
      rainbow_rGb = rainbow_rGb - rainbow_step
      if rainbow_rGb <= rainbow_step then rainind = 4 end
    elseif rainind == 4 then
      rainbow_Rgb = rainbow_Rgb + rainbow_step
      if rainbow_Rgb >= 1-rainbow_step then rainind = 5 end
    else 
      rainbow_rgB = rainbow_rgB - rainbow_step
      if rainbow_rgB <= rainbow_step then rainind = 1 end
    end
    return rainbow_Rgb.." "..rainbow_rGb.." "..rainbow_rgB.." rg"
           .." "..rainbow_Rgb.." "..rainbow_rGb.." "..rainbow_rgB.." RG"
end

local function add_rainbow_color(head)
    for n in traverse_id(node.id"glyph",head) do
        if has_attribute(n,luatexbase.attributes.rainbow) then
            set_attribute(n,luatexbase.attributes["LuaCol@Attribute"],oberdiek.luacolor.getvalue(rainbow_color()))
        end
    end
    return head
end
luatexbase.add_to_callback('pre_linebreak_filter',add_rainbow_color,'add rainbow')

local rainbowcolor = luatexbase.new_luafunction"rainbowcolor"
lua.get_functions_table()[rainbowcolor] = function() setattribute(luatexbase.attributes["rainbow"],1) end
token.set_lua("rainbowcolor", rainbowcolor, "protected")

local unrainbowcolor = luatexbase.new_luafunction"unrainbowcolor"
lua.get_functions_table()[unrainbowcolor] = function() setattribute(luatexbase.attributes["rainbow"], -0x7FFFFFFF) end
token.set_lua("unrainbowcolor", unrainbowcolor, "protected")

local rainbowstep = luatexbase.new_luafunction"rainbowstep"
lua.get_functions_table()[rainbowstep] = function() scan_keyword'=' rainbow_step = scan_real() end
token.set_lua("rainbowstep", rainbowstep, "protected")
}
\rainbowstep=0.1
\begin{document}
{\rainbowcolor foo bar baz} 
\blindtext

\rainbowcolor 
\blindtext

 \unrainbowcolor
\blindtext

\rainbowstep0.005
\rainbowcolor 
\blindtext
\end{document}

在此处输入图片描述

笔记

  • 与 不同chickenize\rainbowcolor这个尊重分组并且可以应用于段落的一部分,而不是整个段落,我发现它更方便,但如果你愿意,可以轻松修改代码以与 一样工作chickenize

  • rainbow_step您可以使用宏更改的值\rainbowstep,更改是全局的,并且只考虑换行时的值(如\baselineskip)。

  • 代码应该与兼容chickenize,除非我在不知情的情况下覆盖了某些函数或宏(除了\(un)rainbowcolor

问题2

不确定您所说的“生产者”是什么意思(PDF 字段?日志中的第一行?),但默认情况下lualatex使用该命令luahbtex。我认为您应该在另一篇文章中询问,这两个问题实际上毫无关联。

相关内容