將文字在左邊距置中對齊;神秘的水平空間

將文字在左邊距置中對齊;神秘的水平空間

我有以下內容:

\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定義中的適當位置。

相關內容