包含被 lualatex 处理的 lilypond 文件不能包含 % 符号注释

包含被 lualatex 处理的 lilypond 文件不能包含 % 符号注释

下面的 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 发行版一起提供。

相关内容