
Я пытаюсь воспроизвести аккорды над текстом с помощьюлистыПакет leadsheets предоставляет высокоуровневую команду \chord{A#}
, которую я избегаю по причинам, о которых забыл (не имеет большого значения, оказывается, вопрос не зависит от leadsheets). Поэтому я использую пользовательскую \overset{A#}{foo}
команду (приблизительно скопированную отсюдаСоздание нематематических заменителей для \overset и \underset, не зависящих от пакета amsmath):
\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
.
Рендеринг:
Проблема в том, что буквы аккорда D
, A
и C
в примере не выровнены по вертикали. Я предполагаю, что это из-за рендеринга символа диеза ♯
в пакете leadsheets, который имеет вертикальную нижнюю границу, которая ниже букв, хотя рендеринг символа диеза кажется очень особенным (возможно, чтобы сделать его больше), не уверен, какая магия там используется. Команда \chord
из leadsheets не имеет этого недостатка, но я недостаточно понимаю латекс низкого уровня, чтобы скопировать этот подход.
Как лучше всего выровнять буквы по вертикали (для меня было бы приемлемо, если бы символ диеза мог перекрываться с текстом ниже). Также было бы приемлемо изменить способ отображения символа диеза в свинцовом листе, если это проще, хотя и так выглядит красиво.
(ПРАВКА: На самом деле то же самое вертикальное смещение можно воспроизвести без нотных листов, просто используя тест на перестановку Aj
и Ax
. В идеале основания a
s должны быть выровнены по вертикали. Но для этого вопроса требуется только решение для символа диеза в нотных листах, поскольку общее решение может оказаться сложнее, и, к счастью, в нотной записи не так много других символов с низко висящими основаниями.)
решение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
}%
}%
}
Я не могу хорошо объяснить, что здесь происходит по сравнению с оригиналом (кто угодно может изменить ответ, чтобы объяснить), но, похоже, это работает надежно для разных персонажей, выравнивая выступы.