
我有以下內容:
\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
定義中的適當位置。