텍스트를 왼쪽 여백 중앙에 정렬합니다. 신비한 수평 공간

텍스트를 왼쪽 여백 중앙에 정렬합니다. 신비한 수평 공간

나는 다음을 가지고 있습니다 :

\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수정하세요. 이 문제를 알아낼 수 있도록 더 읽기 쉽게 코드를 수정해야 했습니다.)

답변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.

관련 정보