自定义文本覆盖,对齐字母基数

自定义文本覆盖,对齐字母基数

我尝试使用主打单包。leadsheets 包提供了一个高级命令\chord{A#},我因为忘记的原因而避免使用它(这没什么大不了的,事实证明这个问题与 leadsheets 无关)。所以我使用了一个自定义\overset{A#}{foo}命令(大致从这里复制而来创建不依赖于 amsmath 包的 \overset 和 \underset 的非数学模式替代品):

\documentclass{book}

\usepackage[full]{leadsheets}

% print chord over the line spanning several characters
\newcommand\textoverset[2]{%
  \leavevmode
  \vbox{\offinterlineskip
    \halign{%
      ##\hfil\cr
      \vphantom{A}#1\cr
      \noalign{}
      \strut#2\cr
    }%
  }%
}

\begin{document}

   % \writechord from leadsheets package, \textoverset defined above
   appar\textoverset{\writechord{Dm}}{ence}s\textoverset{\writechord{A\#}}{} \textoverset{\writechord{C}}{} ...

   % EDIT: Inside song environment, sharp can be written without slash
   \begin{song}{title=Foo}, interpret={F.Oo}\index{Foosong}

      appar\textoverset{\writechord{Dm}}{ence}s\textoverset{\writechord{A#}}{} \textoverset{\writechord{C}}{} ...

   \end{song}

\end{document}

用 运行latexmk -xelatex

渲染:

在此处输入图片描述

问题是示例中的和弦字母DAC垂直对齐。我认为这是由于leadsheets 包中升号符号的渲染具有低于字母的垂直下限,尽管升号符号的渲染看起来非常特殊(可能是为了使其更大),但不确定那里使用了什么魔法。leadsheets\chord中的命令没有这个缺陷,但我对低级 latex 的了解不足以复制该方法。

让字母垂直对齐的最佳方法是什么(对我来说,如果尖锐符号可以与下面的文本重叠,那就可以接受)。如果这样更容易,也可以改变 leadsheet 渲染尖锐符号的方式,尽管这样看起来很漂亮。

Aj(编辑:实际上,无需使用铅字表,只需使用重叠测试和,即可重现相同的垂直错位。Ax理想情况下,s 的基部a应垂直对齐。但对于这个问题,只需要解决铅字表中的尖锐符号,因为一般解决方案可能更难,而且幸运的是,音乐符号没有许多其他带有低垂基部的符号。)

答案1

您似乎已重新定义\#,因为您的代码生成了 # 而不是尖角符号。只需将其粉碎即可。

\documentclass{book}

\usepackage[full]{leadsheets}

% print chord over the line spanning several characters
\newcommand\textoverset[2]{%
  \leavevmode
  \vbox{\offinterlineskip
    \halign{%
      ##\hfil\cr
      \vphantom{A}#1\cr
      \noalign{}
      \strut#2\cr
    }%
  }%
}
\DeclareRobustCommand{\#}{\smash{$\sharp$}}

\begin{document}

\show\#

   % \writechord from leadsheets package, \textoverset defined above
   appar\textoverset{\writechord{Dm}}{ence}s\textoverset{\writechord{A\#}}{} \textoverset{\writechord{C}}{} ...

\end{document}

在此处输入图片描述

答案2

在@egreg 的帮助下,根据他的回答我进行了自定义\textoverset,我想出了这种变体,它可以为所有重叠提供更稳定的对齐:

\newcommand\textoverset[2]{%
  \leavevmode
  \vbox{\offinterlineskip
    \halign{%
      ##\hfil\cr % center
      \strut#1\cr
      \vphantom{(/Aj}#2\cr
    }%
  }%
}

我无法很好地解释这里与原文相比发生了什么(任何人都可以修改答案来解释),但这似乎对各种字符都很有效,可以对齐过度设置。

相关内容