カスタムテキストオーバーセット、文字ベースを揃える

カスタムテキストオーバーセット、文字ベースを揃える

私は、リードシートパッケージ。leadsheets パッケージは、私が忘れてしまった理由で避けている高レベルのコマンドを提供します(あまり重要ではありませんが、質問は leadsheets とは無関係であることがわかりました)。そのため、カスタムコマンド (ここからコピーしたもの\chord{A#}) を使用します。\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

レンダリング:

ここに画像の説明を入力してください

問題は、例のコード文字D、 、Aが垂直に揃っていないことです。これは、垂直下限が文字よりも低いリードシート パッケージのシャープ記号のレンダリングによるものだと思いますが、シャープ記号のレンダリングは非常に特殊なようです (おそらく大きくするため)。どのような魔法が使われているのかはわかりません。リードシートのコマンドにはその欠陥はありませんが、そのアプローチをコピーできるほど低レベルの LaTeX を理解していません。C\chord

文字を垂直に揃えるには、どのような方法が最適ですか (シャープ記号が下のテキストと重なっても問題ありません)。また、シャープ記号をレンダリングするリードシートの方法を変更することも、その方が簡単であれば問題ありませんが、現状のままでも見栄えは良いです。

Aj(編集: 実際には、オーバーセット テストと を使用するだけで、リードシートなしで同じ垂直方向のずれを再現できますAx。理想的には、s のベースはa垂直に揃っている必要があります。ただし、この問題では、リードシートのシャープ記号のソリューションのみが必要です。一般的なソリューションは難しい可能性があり、幸いなことに、音楽記譜法には低く垂れ下がったベースを持つ他の記号はあまりありません。)

答え1

を再定義したようです\#。コードではシャープ記号ではなく # が生成されます。単に smash してください。

\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
    }%
  }%
}

オリジナルと比較してここで何が起こっているのかをうまく説明することはできません (誰でも説明するために回答を変更することができます) が、これはさまざまな文字に対して確実に機能し、オーバーセットを揃えているようです。

関連情報