下面的 MWE 显示了两个文件协同工作,使用该lyluatex
包创建一个包含音乐的文档。不幸的是,我发现如果我在文件 test.ly 的任何位置向内容添加任何注释,编译就会失败并报告错误(请参阅下面稍微清理过的日志),这让我相信导入依赖它的注释的文件存在问题% signs
。不过,我发现注释在 tex 文件的任何地方都没有问题。
Module lyluatex Warning: Found something incompatible with `fragment`
(lyluatex) (or `relative`). Setting them to false.
(lyluatex) on input line 34
lyluatex.lua:841: invalid use of '%' in replacement string
stack traceback:
[C]: in function 'gsub' lyluatex.lua:841: in function 'flatten_content'
lyluatex.lua:1082: in function 'output_filename'
lyluatex.lua:531: in function 'calc_properties'
lyluatex.lua:1088: in function 'process'
[\directlua]:1: in main chunk.
\ly@compilescore ...directlua {ly.score:process()}
l.34 \end{tune}
?
两个重现:以下 MWE 分为 2 个文件:
1-tex 文件
2-包含 lilypond 源文件
如果使用 lualatex 进行编译,则代码将按原样编译并生成预期的 pdf(即lualatex.exe" -shell-escape "test.tex"
)
测试.tex
\documentclass[letter,fontsize=12pt]{article}
\usepackage{xparse} % can exclude expl3, xparse loads it
\usepackage{xpatch} % can exclude etoolbox, xpatch loads it
\usepackage{luatexbase}
\usepackage[program=lilypond]{lyluatex}
\DeclareDocumentCommand{\tune}{}
{%
\ly
}
\def\endtune
{%
\endly
}
\begin{document}
\begin{tune}
%\version "2.18.2"
\include "test.ly"
first = \transpose c d {\tune}
second = \transpose c b {\tune}
\score {
<<
\unfoldRepeats{\first\second}
>>
\layout{}
}
\end{tune}
\end{document}
测试
global = {
\key b \minor
\time 9/8
}
tune = \absolute {
\global
\relative c' { c8 d e f g a b c c }
\bar ":|."
}
test.ly(修改失败)
global = {
\key b \minor
\time 9/8
}
tune = \absolute {
\global % a comment can't go here
% a comment can't seem to go here either
\relative c' { c8 d e f g a b c c }
\bar ":|."
}
我想探索或进一步了解为什么 lualatex%
是一个预期的乳胶特殊字符,但却让我感到窒息。
答案1
Lua 错误消息
lyluatex.lua:841: invalid use of '%' in replacement string
表示在模式匹配操作中出现了错误。(Lua 实际上并不执行正则表达式。相反,它执行与之密切相关的操作,称为模式匹配。首先粗略地估计,模式匹配是正则表达式的一个子集。)
果然,文件第841行lyluatex.lua
包含以下代码:
ly_code = ly_code:gsub(iline, self:flatten_content(f:read('*a')))
gsub
(的缩写string.gsub
)执行模式匹配(和替换)。
在 Lua 中,%
在模式匹配操作中遇到字符时,该字符具有特殊含义。例如,%s
表示“[1 个] 空格字符实例”,%s-
表示“零个或多个空格字符实例”。要将%
字符作为其自身进行处理,必须将其输入为%%
。
转到文件test.ly
,该文件由包含上述第 841 行的函数读取。为了使其内容可以被 Lua 的模式匹配操作接受,需要将所有 实例翻倍%
:
global = {
\key b \minor
\time 9/8
}
tune = \absolute {
\global %% a comment can now go here
%% a comment can now go here as well
\relative c' { c8 d e f g a b c c }
\bar ":|."
}
当然,这并不能保证一切都会顺利;它只能保证 Lua 不会因“ %
”而受阻。 中的代码test.ly
似乎是某种混合代码;在其中包含注释可能不是一个好主意。顺便说一句,要在“纯”Lua 代码中启动注释,请写入--
。
答案2
此错误已在可用源代码中修复在 GitHub 上,但在 TeXLive 2018 发行版中不可用。要“修补”您的安装lyluatex
,需要复制 2 个文件,如下所示在 README 中描述。
把这些放在一起(根据记忆!):
# Get lyluatex from GitHub
$ cd ~/Tools
$ git clone https://github.com/jperon/lyluatex.git
# Install a fresh version of lyluatex in your usertree
$ tlmgr init-usertree
$ tlmgr --usermode install lyluatex
# This newly installed lyluatex is here:
$ cd ~/texmf/
# Patch it with the 2 files from the GitHub checkout
$ cp ~/Tools/lyluatex/lyluatex.lua scripts/lyluatex/lyluatex.lua
$ cp ~/Tools/lyluatex/lyluatex.sty tex/luatex/lyluatex/lyluatex.sty
我预计这个答案的保质期会很短,并且修复后的 lyluatex 很快就会随主要的 TeXLive 发行版一起提供。