사용자 정의 텍스트 오버셋, 문자 베이스 정렬

사용자 정의 텍스트 오버셋, 문자 베이스 정렬

나는리드시트패키지. 리드시트 패키지는 내가 잊어버린 이유로 피하는 고급 명령을 제공합니다 \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, AC이 예에서 수직으로 정렬되지 않는다는 것입니다. 나는 그것이 문자보다 낮은 수직 하한선을 갖는 리드 시트 패키지의 날카로운 기호 렌더링 때문이라고 가정합니다 . 비록 날카로운 기호의 렌더링이 매우 특별해 보이지만(어쩌면 더 크게 만들기 위해) 마술이 무엇인지는 확실하지 않습니다. 거기에 사용되었습니다. 리드 시트의 명령 \chord에는 그러한 결함이 없지만 해당 접근 방식을 복사할 만큼 낮은 수준의 라텍스를 이해하지 못합니다.

문자를 수직으로 정렬하는 가장 좋은 방법은 무엇입니까(저에게는 날카로운 기호가 아래 텍스트와 겹칠 수 있다면 허용될 것입니다). 예리한 기호를 렌더링하는 리드시트 방식을 변경하는 것이 더 쉽다면 허용될 수도 있지만, 그 방식은 꽤 보입니다.

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

원본과 달리 여기서 무슨 일이 일어나고 있는지 잘 설명할 수는 없지만(누구나 설명을 위해 답변을 수정할 수 있음), 이는 과잉을 정렬하여 다양한 캐릭터에 강력하게 작동하는 것 같습니다.

관련 정보