将一些文本放在一行的开头和将一些文本放在同一行的中心的最简单的方法是什么?

将一些文本放在一行的开头和将一些文本放在同一行的中心的最简单的方法是什么?

我希望它(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]

答案4

供您选择:

\documentclass{article}

\begin{document}

\leftline{(H)\hfil some text.}

or precisely

\leftline{\makebox[0pt][l]{(H)}\hfil some text.}

\noindent
(H)\hfil some text.

or precisely

\noindent
\makebox[0pt][l]{(H)}\hfil some text.

\end{document}

在此处输入图片描述

相关内容