我希望它(H)
位于左侧,并some text
位于行的中间。但是,下面的命令不起作用,因为它some text
位于右侧。
\centerline{(H)\hfill some text}
以下可以完成这项工作,但有没有更直接的解决方案?
\centerline{\flushleft{(H)} \centerline{some text}}
答案1
例如:
\documentclass{article}
\begin{document}
\hrule % show line width
\noindent\rlap{(H)}\hfill some text\hfill\null\par
\hrule
\end{document}
\noindent
开始一个新段落,不缩进第一行。\rlap
将其参数打印到右侧。中间文本通过将其包装在 中居中\hfill...\hfill
。\null
段落末尾的 ( \par
) 可防止 TeX 删除前一个\hfill
(TeX 会删除段落末尾的最后一个水平空格)。
\hfill
右侧的 可以被自动插入的替换\parfillskip
:
\noindent\rlap{(H)}\hfill some text{\setlength{\parfillskip}{\fill}\par}
答案2
这是一个完全符合 LaTeX 要求的解决方案。
\documentclass{article}
\usepackage{showframe} % just for the example
\newcommand{\lcrline}[3]{%
\par % we want to be on a line by itself
\noindent % no indent
\makebox[\linewidth][s]{% spread to the line width
\makebox[0pt][l]{#1}% text at left
\hfill
\makebox[0pt][c]{#2}% text at center
\hfill
\makebox[0pt][r]{#3}% text at right
}%
\par
}
\begin{document}
\lcrline{(H)}{some text}{}
\bigskip
\lcrline{Left}{Longer text in the middle}{Right}
\end{document}
嗯,还有
\def\lcrline#1#2#3{\par\hbox to \linewidth{\rlap{#1}\hss#2\hss\llap{#3}}
本质上会起到相同的作用。为什么不使用这个?因为上述解决方案仅使用 LaTeX 手册中记录的命令,并且如果发布的新版本破坏了上述宏,您可以将其归咎于维护者;另一个(与本问题的其他答案在精神上类似)将被拒绝,理由是“我们只对记录的功能负责”。
如果发生重叠则会发出警告的扩展版本。
\documentclass{article}
\usepackage{showframe} % just for the example
\newcommand{\lcrline}[3]{%
\par % we want to be on a line by itself
%%% check for no overlapping
\checklcrlineoverlap{#1}{#2}{#3}
\noindent % no indent
\makebox[\linewidth][s]{% spread to the line width
\makebox[0pt][l]{#1}% text at left
\hfill
\makebox[0pt][c]{#2}% text at center
\hfill
\makebox[0pt][r]{#3}% text at right
}%
\par
}
\makeatletter
\newcommand\checklcrlineoverlap[3]{%
\@tempswafalse
\settowidth\@tempdima{#1}%
\settowidth\@tempdimb{#2}%
\ifdim\dimexpr\@tempdima+0.5\@tempdimb>.5\linewidth
\@tempswatrue
\fi
\settowidth\@tempdima{#3}%
\settowidth\@tempdimb{#2}%
\ifdim\dimexpr\@tempdima+0.5\@tempdimb>.5\linewidth
\@tempswatrue
\fi
\if@tempswa
\@latex@warning{Overlap for \protect\lcrline}%
\fi
}
\makeatother
\begin{document}
\lcrline{(H)}{some text}{}
\bigskip
\lcrline{Left}{Longer text in the middle}{Right}
\bigskip
\lcrline{Long long text at the left}{Longer longer text in the middle}{Right}
\bigskip
\lcrline{Left}{Longer longer text in the middle}{Long long text at the right}
\end{document}
终端和日志文件将显示
LaTeX Warning: Overlap for \lcrline on input line 47.
LaTeX Warning: Overlap for \lcrline on input line 51.
答案3
\usepackage{xparse}
\NewDocumentCommand\linetext{O{}mO{}}
{\par\noindent
\makebox[\textwidth][s]{\makebox[0pt][l]{#1}\hss\makebox[0pt][c]{#2}\hss\makebox[0pt][r]{#3}}}
然后使用\linetext[left]{center}[right]
,其中第一个和第三个参数是可选的,因此您可以写\linetext{center}
或\linetext[left]{center}
或\linetext{center}[right]
。