我真的很想通过用彩虹色打印一个单词来吸引读者的注意力。通常使用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}
\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
。我认为您应该在另一篇文章中询问,这两个问题实际上毫无关联。