我正在寻找一种方法来用单个歌曲文件创建歌本。
每个歌曲文件都是一个独立的文本数据块,由以下内容组成:
- 歌名
- 歌曲作者
- 一些详细信息(可选)
- 带和弦的歌词(在 LaTeX 环境中排版
guitar
)
如果我这样做手动我会在文件中放入类似这样的内容song1.tex
:
\section{Song Name}
\paragraph{Song author}
\textit{Some details}
\begin{guitar}
Lyrics with chrods
\end{guitar}
然后\include{song1}
在main.tex
使用。(我找到了一种方法来包含所有文件自动使用 Lua 脚本)
但是,我希望源文件的格式尽可能简单(它们是为了由不懂 TeX 的人添加)。
我正在考虑将歌曲存储在纯.txt
文本文件中,其中行号指定字段:
Song Name
Song Author
Song details
Song lyrics...
....
但我还不知道如何轻松解析这一点。此外,多行歌曲详细信息之类的东西也会破坏这一点。
其他想法包括将其存储在 JSON 中:
{"name":"Name",
"author":"Author",
"details":"Details",
"lyrics":"Song \n Lyrics"
}
或 YAML:
name: Name
author: Author
details: >
Multi-line
Details
lyrics: >
Multiline
Lyrics
并解析这些?
在 LaTeX 中,最自然的实现方法是什么?你会怎么做?
答案1
从一个歌曲文件MHALL.txt
(Mary Had A Little Lamb)开始,根据 OP 想要的格式:
Mary Had a Little Lamb
Anonymous
Children's song
^{A}Mary had a little lamb,
^{E}Little lamb, ^{A}little lamb,
^{A}Mary had a little lamb,
Its ^{E}fleece was white as ^{A}snow.
^{A}Everywhere that Mary went,
^{E}Mary went, ^{A}Mary went,
^{A}Everywhere that Mary went
The ^{E}lamb was sure to ^{A}go
It ^{A$\sharp$}followed her to school one day
...
并使用以下简短代码readarray
,输出可以格式化为带注释的歌词。我对环境一无所知guitar
,所以我创建了自己的“格式化”和弦的格式,即使用输入语法作为输入文件中的活动输入,将和弦名称叠加在一起^{<chord name>}
。请注意,像和弦名称这样的和弦名称^{A$\flat$}
非常适合这种输入样式。显然,这部分格式化可以根据 OP 的愿望进行定制。
\documentclass{article}
\usepackage{readarray,forloop,stackengine}
\setstackgap{L}{.9\baselineskip}% VERTICAL CHORD POSITION
\newcounter{songlines}
{\catcode`\^=\active
\gdef^#1{\trlap{\fbox{\tiny\sffamily\bfseries#1}}}}% CHORD FORMAT
\newcommand\formatsong[1]{%
\bgroup
\catcode`\^=\active
\readrecordarray{#1}\songdata
\section{\songdata[1]}%
\paragraph{\songdata[2]}%
\textit{\songdata[3]}%
\begin{quote}
\forloop{songlines}{4}{\value{songlines}<\nrecords}{%
\songdata[\thesonglines]\\
}%
\end{quote}
\egroup
}
\fboxsep=2pt
\begin{document}
\formatsong{MHALL.txt}
\end{document}
补充
为了展示如何调整和弦格式以适应,我从我的答案中获取了一些例程在歌本中排版吉他和弦图对于我之前的代码,我只是扩大了垂直和弦位置(以便为和弦排版留出空间)并简化了和弦格式(删除所有多余的格式)。
然后,使用引入的例程为用户定义吉他和弦,如\Cm
(C 小调)和\GM
(G 大调),我可以允许用户在输入文件中将这些指定为和弦:
Mary Had a Little Lamb
Anonymous
Children's song
^{\Cm}Mary had a little lamb,
^{\GM}Little lamb, ^{\Cm}little lamb,
...
然后,使用这个增强代码,
\documentclass{article}
\usepackage{readarray,forloop,stackengine}
\setstackgap{L}{2.7\baselineskip}% VERTICAL CHORD POSITION
\newcounter{songlines}
{\catcode`\^=\active
\gdef^#1{\trlap{#1}}}% CHORD FORMAT
\newcommand\formatsong[1]{%
\bgroup
\catcode`\^=\active
\readrecordarray{#1}\songdata
\section{\songdata[1]}%
\paragraph{\songdata[2]}%
\textit{\songdata[3]}%
\begin{quote}
\forloop{songlines}{4}{\value{songlines}<\nrecords}{%
\songdata[\thesonglines]\\
}%
\end{quote}
\egroup
}
\fboxsep=2pt
% FOLLOWING PULLED FROM ANSWER AT
% https://tex.stackexchange.com/questions/324828/typesetting-guitar-chord-diagrams-in-a-songbook/324924#324924
\usepackage{musixguit}
\def\chordalign{\dimexpr2.2ex}% 2.2ex sets alignment of chord
\def\chordminwidth{\dimexpr6.5ex}% 6.5ex provides min. hskip for optional argument
\newcommand\guitarchord[2]{%
\savestack#1{\kern\chordalign\NOtes\guitar #2\en}
}
\newcommand\showchord[2][\relax]{%
\ifx\relax#1\relax\def\tmpuaw{T}\else\def\tmpuaw{F}\fi%
\stackengine{\Lstackgap}{#1}{%
\makebox[0ex][l]{#2}\kern\chordminwidth}{O}{l}{F}{\tmpuaw}{L}%
}
\newcommand\chordline[2]{\setbox0=\hbox{#2}%
\ifdim\wd0>\chordminwidth\showchord{#1}#2\else\showchord[#2]{#1}\fi%
}
\raiseguitar {0}
\guitarchord\Cm{{Cm $^7$}{2}x-----\gbarre1\gdot33\gdot52}
\guitarchord\GM{G{}o-----\gbarre3\gdot25\gdot35\gdot44}
%
\begin{document}
\formatsong{MHALL.txt}
\end{document}
结果可能更符合原作者的想法:
答案2
作为基本的概念思想,我会使用 1)简单的来源,正如您所提到的,以及 b)通过某些脚本语言生成那些 .tex 文件(对于经验丰富的脚本编写者来说,这是毫不费力或低脑筋的事情)。
简单来源的示例
- 纯 ASCII,例如具有合适且简单的目录结构
- 数据库,例如 MS Access(或 mysql 等)
- 网络公式等等
脚本例如
- Perl
- php(命令行)
- JavaScript
- 通过 MS Access (或 mysql 或其他) 中的专用查询进行连接
让我知道您的偏好,我会尝试为您制定一些基本代码(如果可以的话)。
结构
仅限一个文件的方法
使用专用的(自己的)标记,您的脚本可以轻松识别。例如,在 Perl 中很容易做到:
#N Blowin' in the wind
#A Bob Dylon
#D This song was ... bla bla
(many lines later
and this is all you should know about it
#I Guitar
#L How man roads
must a man walk down
...
目录编码
假设歌曲数量多于作者数量。那么结构可能是这样的
\Bob Dylan
\Bob Dylan\Blowin in the wind
\Bob Dylan\Blowin in the wind\details.txt
\Bob Dylan\Blowin in the wind\lyrics.txt
\Bob Dylan\Blowin in the wind\instruments.txt
在“\”处分割 PATH 会为您提供所有细节和访问权限。
数据库方法
您可能想要定义数据库中的字段,或者 Excel 等电子表格中的列,如下所示:
author song details instrument lyrics year ...
其中细节和歌词允许使用长文本,而其他内容可以更短。例如,在 MS Access 中,您始终可以将表格转换为表单,如下所示:
表结构
形式
顺便说一句...当您通过具有底层数据库(如mysql)的Web界面(表单)执行此操作时,您将拥有相同的成分和表示。
PS:让我从另一篇文章中补充一点,datatool
从系统设计的角度来看,使用将为您打开这个机会:
- 使用一些前端来让你的作者输入信息(数据库,网络表单)
- 通过访问每个数据集https://ctan.org/pkg/datatool乳胶