Alinhar o texto centralizado na margem esquerda; espaço horizontal misterioso

Alinhar o texto centralizado na margem esquerda; espaço horizontal misterioso

Eu tenho o seguinte:

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

que fornece a seguinte saída:

saída

Por que o primeiro uso está desalinhado? De onde vem o espaço extra? (Sinta-se à vontade para expl3modificar o código se ele queimar os olhos - tive que adaptá-lo para torná-lo mais legível para poder tentar descobrir isso.)

Responder1

Você está armazenando uma versão não formatada do entrevistador e do entrevistado, mas está definindo uma versão formatada (usando \textsc) em seu documento. Você também usa esta versão não formatada para medir o comprimento, o que está causando o desalinhamento.

Corrigi isso usando as seguintes definições de \interviewerand \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 }
  }
}

insira a descrição da imagem aqui

Porém, eu sugeriria definir uma macro adequada que armazene a formatação do entrevistador e do entrevistado, respectivamente. Por exemplo,

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

e, em seguida, coloque-os nos locais apropriados em suas definições \interviewere .\interviewee

informação relacionada