我使用 LaTeX 和 LilyPond(使用)排版了一本包含音乐作品的书lilypond-book
。每首乐曲都从新的一页开始,长度从不到一页到几页不等。
我希望每首乐曲都填满所需的页数,这样乐曲最后一页的底部就不会留有空隙,并且所有页面的五线谱间距均匀。这可以在 LilyPond 中通过设置ragged-last-bottom
为 来实现##f
。这是一个简单的例子(music.ly
):
#(set-global-staff-size 32)
\paper {
paper-width = 18.5\cm
ragged-last-bottom = ##f
}
\header{
tagline = ##f
}
{
c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c
c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c
c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c
c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c
c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c
}
这将产生以下输出:
第 1/2 页:
第 2/2 页:
现在,当我尝试在 LaTeX 中使用它时,它不起作用,因为将lilypond-book
LilyPond 输出分成.eps
每个包含单行的文件,并且这些文件被生成的.tex
文件一个接一个地包含。
因此,此 LaTeX 文件生成的输出不会用均匀分布的谱表完全填满页面(正如您在最后一页中轻松看到的那样):
\documentclass[a4paper]{article}
\usepackage{geometry}
\begin{document}
hello world
\lilypondfile{music.ly}
\end{document}
第 1/3 页:
第 2/3 页:
第 3/3 页:
所以我的问题很简单:如何让 LaTeX 的行为像 LilyPondragged-last-bottom
那样##f
?
非常感谢!☺
答案1
有趣的问题!最终,经过大量的思考和准备工作,解决方案最终变得非常简单。
感谢您向我介绍 lillypond — 很酷的东西。
我仍然有点困惑,因为我只使用了大约 5 分钟,但这就是我发现的。
你制作这个文件,我将其命名为 lillypond.ly:
#(set-global-staff-size 32)
\paper {
paper-width = 18.5\cm
ragged-last-bottom = ##f
}
\header{
tagline = ##f
}
{
c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c
c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c
c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c
c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c
c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c
}
我直接从你的问题中得到了这个答案。
另外,直接从您的问题是这个文件,我将其命名为 lillypondtex.lytex (.lytex 扩展名很重要并且很难弄清楚。)
\documentclass[a4paper]{article}
\usepackage{geometry}
\begin{document}
hello world
\lilypondfile{lillypond1.ly}
\end{document}
Applications/LilyPond.app/Contents/Resources/bin/lilypond-book --output=out --pdf lillypondtex.lytex
如果您使用的是 Mac 电脑,又懒得按照安装说明操作,那么此文件至少会通过命令进行编译。在正常安装中,我认为此命令应该只是lilypond-book --output=out --pdf lillypondtex.lytex
。
该命令生成一个名为 的新目录out
,其中包含一个名为5a
(稍后很重要)的目录和以下文件:
lillypondtex.dep
lillypondtex.tex
snippet-map--9077002354240704700.ly
snippet-names--9077002354240704700.ly
现在我们终于取得了一些进展,终于得到了我熟悉并喜爱的扩展!
pdflatex
继续运行lillypondtex.tex
将得到与你看到的结果相同但你不喜欢的输出。
该lillypondtex.tex
文件包含以下内容:
\documentclass[a4paper]{article}
\usepackage{geometry}
\usepackage{graphics}
\begin{document}
hello world
{%
\parindent 0pt
\noindent
\ifx\preLilyPondExample \undefined
\else
\expandafter\preLilyPondExample
\fi
\def\lilypondbook{}%
\input{5a/lily-66b633c5-systems.tex}
\ifx\postLilyPondExample \undefined
\else
\expandafter\postLilyPondExample
\fi
}
\end{document}
仍然有点混乱,但是这条线\input{5a/lily-66b633c5-systems.tex}
是关键。
现在,进入5a
目录,我们有一个名为的文件lily-66b633c5-systems.tex
,它最终是文档的布局代码。
\includegraphics{5a/lily-66b633c5-1}%
\ifx\betweenLilyPondSystem \undefined
\linebreak
\else
\expandafter\betweenLilyPondSystem{1}%
\fi
\includegraphics{5a/lily-66b633c5-2}%
\ifx\betweenLilyPondSystem \undefined
\linebreak
\else
\expandafter\betweenLilyPondSystem{2}%
\fi
\includegraphics{5a/lily-66b633c5-3}%
\ifx\betweenLilyPondSystem \undefined
\linebreak
\else
\expandafter\betweenLilyPondSystem{3}%
\fi
\includegraphics{5a/lily-66b633c5-4}%
\ifx\betweenLilyPondSystem \undefined
\linebreak
\else
\expandafter\betweenLilyPondSystem{4}%
\fi
\includegraphics{5a/lily-66b633c5-5}%
\ifx\betweenLilyPondSystem \undefined
\linebreak
\else
\expandafter\betweenLilyPondSystem{5}%
\fi
\includegraphics{5a/lily-66b633c5-6}%
\ifx\betweenLilyPondSystem \undefined
\linebreak
\else
\expandafter\betweenLilyPondSystem{6}%
\fi
\includegraphics{5a/lily-66b633c5-7}%
\ifx\betweenLilyPondSystem \undefined
\linebreak
\else
\expandafter\betweenLilyPondSystem{7}%
\fi
\includegraphics{5a/lily-66b633c5-8}%
\ifx\betweenLilyPondSystem \undefined
\linebreak
\else
\expandafter\betweenLilyPondSystem{8}%
\fi
\includegraphics{5a/lily-66b633c5-9}%
\ifx\betweenLilyPondSystem \undefined
\linebreak
\else
\expandafter\betweenLilyPondSystem{9}%
\fi
\includegraphics{5a/lily-66b633c5-10}%
\ifx\betweenLilyPondSystem \undefined
\linebreak
\else
\expandafter\betweenLilyPondSystem{10}%
\fi
\includegraphics{5a/lily-66b633c5-11}%
\ifx\betweenLilyPondSystem \undefined
\linebreak
\else
\expandafter\betweenLilyPondSystem{11}%
\fi
\includegraphics{5a/lily-66b633c5-12}%
\ifx\betweenLilyPondSystem \undefined
\linebreak
\else
\expandafter\betweenLilyPondSystem{12}%
\fi
\includegraphics{5a/lily-66b633c5-13}%
\ifx\betweenLilyPondSystem \undefined
\linebreak
\else
\expandafter\betweenLilyPondSystem{13}%
\fi
\includegraphics{5a/lily-66b633c5-14}%
% eof
这些\linebreak
命令就是问题所在,这就是为什么 LaTeX 将音乐视为一个段落而不是将其均匀分布。
此处所做的任何更改都将影响 的输出lillypond.tex
。从这里开始,我相信这里有比我更有经验的人可以对此进行进一步的调整。
但是,有几个简单的解决方案:
\linebreak
只需查找并替换所有带有 with的情况\par
即可\flushbottom
按预期使用lillypond.tex
。输出:
这可以修复所有行和文本之间的间距。如果我用这种方法写书,我会选择将每行音乐变成一个段落,因为它可以\flushbottom
很好地与文本配合使用并使其流畅。此外,此时,David Carlisle 的粘贴到文件\setlength\parskip{\fill}
中的答案lillypond.tex
将按他的意图工作。
另一个选择是用 替换每一个\linebreak
,\vfill
通过填满最后一页,我们可以更接近 OP 期望的结果。
从这里开始,只需缩小边距,使其与 lillypond 的输出类似。顶部和底部的边距为 0.75 英寸,可产生以下输出:
间距均匀,页面填满,我相信这就是您所要求的。
最终lillypond.tex
文件:
\documentclass[a4paper]{article}
\usepackage[margin=.75in]{geometry}
\usepackage{graphics}
\begin{document}
\flushbottom
\centering
hello world
{%
\parindent 0pt
\noindent
\ifx\preLilyPondExample \undefined
\else
\expandafter\preLilyPondExample
\fi
\def\lilypondbook{}%
\input{5a/lily-66b633c5-systems.tex}
\ifx\postLilyPondExample \undefined
\else
\expandafter\postLilyPondExample
\fi
}
\end{document}
我刚刚想到的另一个选择是\pagebreaks
结合使用\vfill
来明确声明每页显示多少行。
如果您想要默认Article
边距:
如何隔开线条,使它们与article
类默认边距均匀分布:\par
在音乐行之间使用,然后\parskip
像这样定义:
\setlength\parskip{26pt plus 36pt minus 0pt}
这告诉 LaTeX,每行之间必须有 26pt,并且可以通过\flushbottom
将每行拉伸 36pt 来满足要求,但不允许将行压缩得更紧密。
结果如下:
LaTeX 将其分成两页,每页五行,和一页,每页四行。
下面是我用来实现它的代码:
\documentclass[a4paper]{article}
\usepackage[]{geometry}
\usepackage{graphics}
\begin{document}
\flushbottom
hello world
{%
\parindent 0pt
\noindent
\setlength\parskip{26pt plus 36pt minus 0pt}
\ifx\preLilyPondExample \undefined
\else
\expandafter\preLilyPondExample
\fi
\def\lilypondbook{}%
\input{5a/lily-66b633c5-systems.tex}
\ifx\postLilyPondExample \undefined
\else
\expandafter\postLilyPondExample
\fi
}
\end{document}