使用 LaTeX 进行诗歌韵律分析 - 文本对齐

使用 LaTeX 进行诗歌韵律分析 - 文本对齐

我正在寻找一种好的解决方案,以便打印诗歌时,重音、重音等(韵律)单独成行。通常,这是通过采用等宽字体(如 \texttt)来实现的,然后在上行需要的地方添加重音。但这需要大量的空格来对齐,这在 LaTeX 中既不容易做到,也不优雅。有什么想法可以更好地做到这一点吗?

您可以在此处找到其样子的示例:https://en.wikipedia.org/wiki/Scansion#Elements

\texttt{~~/~~~x~~~x~~/~~x~~~~x~~~~/~[x]/~x~~~~~/}\\
\texttt{When to the sessions of sweet silent thought}

我需要的是能够对齐韵律符号(通常是字母或斜线和下划线),使其与下一行文本音节(第一个元音)内的准确位置对齐。我希望这有意义。传统上,这是如上所述通过使用等宽字体并在符号之间添加所需的空格来解决的。

非常感谢您的帮助!

答案1

您可以使用重读和非重读元音的命令。

\documentclass{article}

\newcommand{\sni}[1]{\scansion{\smallertimes}{#1}}
\newcommand{\sbi}[1]{\scansion{\smallerbrackettimes}{#1}}
\newcommand{\si}[1]{\scansion{\smallerslash}{#1}}

\newcommand{\scansion}[2]{%
  \begingroup
  \renewcommand{\arraystretch}{0}%
  \begin{tabular}[b]{@{}c@{}}
  \makebox[0pt]{#1}\\[0.5ex]
  \vphantom{T}#2
  \end{tabular}%
  \endgroup
}
\newcommand{\smallertimes}{$\scriptstyle\times\mathstrut$}
\newcommand{\smallerbrackettimes}{$\scriptstyle[{\times}]$}
\newcommand{\smallerslash}{$\scriptstyle/$}

\begin{document}

\noindent
\texttt{~~/~~~x~~~x~~/~~x~~~~x~~~~/~[x]/~x~~~~~/}\\
\texttt{When to the sessions of sweet silent thought}

\bigskip

\noindent
Wh\si{e}n t\sni{o} th\sni{e} s\si{e}ss\sni{i}ons
\sni{o}f sw\si{e}et\sbi{ }s\si{i}l\sni{e}nt th\si{o}ught

\end{document}

在此处输入图片描述

答案2

这可以用我的包来完成metrix

例如

\metrics{_    u  u  _   _  _  | _    _  u  u   _  _   _   }
        {flos ve-te-ris vi-ni | meis na-ri-bus ob-iec-tust}

给出

在此处输入图片描述

如您所见,它使用字母作为输入,但使用符号作为输出,因为我相信使用字母表示重音符号只是用户不知道如何添加特殊符号的一种解决方法。

请查看手册以获取更多示例和信息。

答案3

这是基于我过去合唱排练时使用的一些代码,试图将适当的重音放在适当的位置。使用是tikz最近的,简化了重音符号的放置。

这里实施的方法是基于这样的观察:音节一般来说在大多数单词中均匀分布。在第二个例子(“Succulent...”)中,我指出了如何处理非典型的音节长度分布。

我倾向于尽可能避免使用标记。这里的原则是在重音模式的单词前面加上命令\sn,并使用/表示重音,*使用 表示非重音音节。因此,logarithm将给出sn/*/* logarithm如下形式:

对数示例

\documentclass{article}
\usepackage{tikz}

\newbox\wordbox
\newbox\stressbox

\def\mymacron{%
    \tikz[baseline] \draw (0,0) -- (0.5ex,0);%
}

\def\mybreve{%
    \tikz[baseline] \draw[yshift=0.15ex] (0,0) arc (180:360:0.25ex);%
}

\def\mb{% for [macron]breve
    {\tikz[baseline] 
    {%
        \draw (0.1ex,-0.3ex) -| (-0.2ex,0.35ex) -- (0.1ex,0.35ex);% left brace
        \draw (0,0) -- (0.5ex,0);% breve
        \draw (0.4ex,-0.3ex) -| (0.7ex,0.35ex) -- (0.4ex,0.35ex);% right brace
        \draw (0.8ex,-0.3ex) -- (1ex,0.35ex);% slash
        \draw[yshift=0.15ex] (1.1ex,0) arc (180:360:0.25ex);% breve
    }}%
}

\def\bm{% for [breve]macron
    {\tikz[baseline]
    {%
        \draw (0.1ex,-0.3ex) -| (-0.2ex,0.35ex) -- (0.1ex,0.35ex);% left bracket
        \draw[yshift=0.15ex] (0,0) arc (180:360:0.25ex);% breve
        \draw (0.4ex,-0.3ex) -| (0.7ex,0.35ex) -- (0.4ex,0.35ex);% right bracket
        \draw (0.8ex,-0.3ex) -- (1ex,0.35ex);% slash
        \draw (1ex,0) -- (1.5ex,0);% macron
    }}%
}

\def\process#1{% Adjust this to suit
    \if#1/%
        \mymacron% Change to suit
    \else
        \if#1*%
            \mybreve
        \else
            #1%
        \fi
    \fi
    \hss
}

\def\fifo#1{\ifx\ofif#1\ofif\fi% first in first out
    \process#1\fifo}%

\def\ofif#1\fifo{\fi}

\def\sn#1 #2 {% for *s*cansio*n*
    \setbox\wordbox\hbox{#2}%
    \setbox\stressbox\hbox to\wd\wordbox{\Large\hss\fifo#1\ofif}% Change \Large to alter mark size
    \ooalign{\raisebox{1em}{\box\stressbox}\cr#2\cr}% change the dimension to suit
    \space
}

\begin{document}

\sn/ When \sn* to \sn* the \sn/* sessions \sn* of \sn/ sweet \sn\mb* silent \sn/ thought 

\bigskip

%% Note that anything other than /, *, \mb and \bm should be wrapped in braces. 
\sn/** Succulent \sn/* berries \sn*{\enskip}/{\quad} abound

\end{document}

完整示例

我认为原帖的[x]/ x意思是音节可以是重读也可以是非重读。宏\bm\mb可用于复制此音节。

显然,还有改进的空间,因此欢迎提出意见。


之后

为了我自己,我决定尝试更接近 OP 的要求,并尝试将重音符号放在适当的元音上,同时再次尝试将标记保持在最低限度。源代码看起来有点神秘(有点像xy),但条目很简单:四个特殊字符 -- |>/--*各自接受一个参数(字母),而不需要{...}和分别添加一个马克龙短音[长音符号]短音符**[breve]macron**

\documentclass[12pt]{article}
\usepackage{tikz}
\usepackage{calc}

\newlength\correction

\def\mymacron{%
    \tikz[baseline] \draw (0ex,0) -- (0.5ex,0);%
}

\def\mybreve{%
    \tikz[baseline] \draw[yshift=0.15ex] (0,0) arc (180:360:0.25ex);%
}

\def\mb{% for [macron]breve
    {\tikz[baseline] 
    {%
        \draw (0.1ex,-0.3ex) -| (-0.2ex,0.35ex) -- (0.1ex,0.35ex);% left brace
        \draw (0,0) -- (0.5ex,0);% breve
        \draw (0.4ex,-0.3ex) -| (0.7ex,0.35ex) -- (0.4ex,0.35ex);% right brace
        \draw (0.8ex,-0.3ex) -- (1ex,0.35ex);% slash
        \draw[yshift=0.15ex] (1.1ex,0) arc (180:360:0.25ex);% breve
    }}%
}

\def\bm{% for [breve]macron
    {\tikz[baseline]
    {%
        \draw (0.1ex,-0.3ex) -| (-0.2ex,0.35ex) -- (0.1ex,0.35ex);% left bracket
        \draw[yshift=0.15ex] (0,0) arc (180:360:0.25ex);% breve
        \draw (0.4ex,-0.3ex) -| (0.7ex,0.35ex) -- (0.4ex,0.35ex);% right bracket
        \draw (0.8ex,-0.3ex) -- (1ex,0.35ex);% slash
        \draw (1ex,0) -- (1.5ex,0);% macron
    }}%
}

\setlength{\correction}{0.4em}% Change to suit; probably font-dependent
\begingroup
    \catcode`|=\active
    \catcode`>=\active
    \catcode`/=\active
    \catcode`*=\active
    \gdef\beginscan{%
        \begingroup
        \def|##1{\ooalign{\raisebox{1em}{\hbox to 0pt{\Large\hspace{\correction}\hss\mymacron\hss}}\cr##1\cr}}%
        \def>##1{\ooalign{\raisebox{1em}{\hbox to 0pt{\Large\hspace{\correction}\hss\mybreve\hss}}\cr##1\cr}}%
        \def/##1{\ooalign{\raisebox{1em}{\hbox to 0pt{\Large\hspace{\correction}\hss\mb\hss}}\cr##1\cr}}%
        \def*##1{\ooalign{\raisebox{1em}{\hbox to 0pt{\Large\hspace{\correction}\hss\bm\hss}}\cr##1\cr}}%
        \catcode`|=\active % macron
        \catcode`>=\active % breve
        \catcode`/=\active % [macron]breve
        \catcode`*=\active % [breve]macron
}
\endgroup

\def\endscan{%
    \endgroup
}


\begin{document}

\beginscan
Wh|en t>o th>e s|ess>ions >of sw|eet /sil>ent th|ought

\bigskip

S|ucc>ul>ent b|err>ies >ab|ound

\bigskip

l|og>ar|ith>m
\endscan

\end{document}

在此处输入图片描述

相关内容