テキストを左余白の中央に揃える; 謎の水平スペース

テキストを左余白の中央に揃える; 謎の水平スペース

以下のものがあります:

\documentclass{article}
\usepackage{calc, expl3, xparse}

\makeatletter\ExplSyntaxOn
\def\globalsettoheight{\@gsettodim\ht}
\def\globalsettodepth {\@gsettodim\dp}
\def\globalsettowidth {\@gsettodim\wd}

\def\@gsettodim#1#2#3{%
  \setbox\@tempboxa\hbox{{#3}}\global#2#1\@tempboxa
  \setbox\@tempboxa\box\voidb@x}

\newlength\length@interviewer
\newlength\length@interviewee
\newlength\length@sep

\settowidth\length@sep{:\hspace{1em}}

\NewDocumentCommand\interviewer { m m } {
  \globalsettowidth   \length@interviewer { #1 }

  % Display the full name and then globally redefine to initials,
  % updating the length accordingly.
  \def                      \@interviewer {
    #1
    \global\def             \@interviewer { #2 }
    \globalsettowidth \length@interviewer { #2 }
  }
}

\NewDocumentCommand\interviewee { m m } {
  \globalsettowidth   \length@interviewee { #1 }

  % Display the full name and then globally redefine to initials,
  % updating the length accordingly.
  \def                      \@interviewee {
    #1
    \global\def             \@interviewee { #2 }
    \globalsettowidth \length@interviewee { #2 }
  }
}

\NewDocumentEnvironment { question } { m } {
  \par\noindent
  \hspace{-\length@interviewer}
  \hspace{-\length@sep}
  \textsc{\@interviewer}:
  \hspace{1em}
  #1
  \vspace{1ex}

  \par\noindent
  \hspace{-\length@interviewee}
  \hspace{-\length@sep}
  \textsc{\@interviewee}:
  \hspace{1em}
  \ignorespaces
} {
  \vspace{3ex}
}
\ExplSyntaxOff\makeatother

\interviewer{Jane Doe}{JD}
\interviewee{John Smith}{JS}

\setlength\parindent{3em}

\usepackage{mwe}
\begin{document}
\begin{question}{Sample Question?}
  \lipsum[1]
\end{question}
\begin{question}{Sample Question?}
  \lipsum[2]
\end{question}
\begin{question}{Sample Question?}
  \lipsum[3]
\end{question}
\end{document}

次のような出力が得られます。

出力

最初の使用がなぜずれているのでしょうか? 余分なスペースはどこから来ているのでしょうか? (expl3目が痛くなる場合は、遠慮なくコードを -ify してください。私は、これを理解できるように、より読みやすくするためにコードを変更する必要がありました。)

答え1

インタビュアーとインタビュー対象者のフォーマットされていないバージョンを保存していますが、\textscドキュメントではフォーマットされたバージョン( を使用)を設定しています。また、このフォーマットされていないバージョンを使用して長さを計測しているため、位置がずれています。

\interviewer私はとの次の定義を使用してこれを修正しました\interviewee:

\NewDocumentCommand\interviewer { m m } {
  \globalsettowidth   \length@interviewer { \scshape #1 }% Updated with formatting

  % Display the full name and then globally redefine to initials,
  % updating the length accordingly.
  \def                      \@interviewer {
    #1
    \global\def             \@interviewer { #2 }
    \globalsettowidth \length@interviewer { #2 }
  }
}

\NewDocumentCommand\interviewee { m m } {
  \globalsettowidth   \length@interviewee { \scshape #1 }% Updated with formatting

  % Display the full name and then globally redefine to initials,
  % updating the length accordingly.
  \def                      \@interviewee {
    #1
    \global\def             \@interviewee { #2 }
    \globalsettowidth \length@interviewee { #2 }
  }
}

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

ただし、インタビュアーとインタビュー対象者のフォーマットをそれぞれ保存する適切なマクロを定義することをお勧めします。たとえば、

\providecommand{\@interviewerfont}{\normalfont}
\providecommand{\@intervieweefont}{\normalfont}
\newcommand{\interviewerfont}[1]{%
  \renewcommand{\@interviewerfont}{#1}}
\newcommand{\intervieweefont}[1]{%
  \renewcommand{\@intervieweefont}{#1}}

\interviewer次に、これらを定義内の適切な場所に配置します\interviewee

関連情報