海报文字定位:获取 \hfill 的宽度

海报文字定位:获取 \hfill 的宽度

如何才能0123456789像红色所示那样对齐:与 基线相同abcdefghij,与 左对齐ABCDEFGHIJKL

\vline仅用于说明。我正在设计一张海报,其中精确的文本定位很重要。

\documentclass{article}
\usepackage[absolute,overlay]{textpos}

\begin{document}
\begin{textblock*}{10cm}(5cm,5cm)
\noindent\vline
\hfill\begin{tabular}{l@{}}
  ABCDEFGHIJ\\
  ABCDEFGHIJKL\\
  ABCDEFGH
\end{tabular}
\vline
\end{textblock*}

\begin{textblock*}{10cm}(5cm,10cm)
  \hfill 0123456789
  \vline
\end{textblock*}

\begin{textblock*}{10mm}(5cm,10cm)
\noindent\vline
  abcdefghij\\
  abcdefghijkl\\
  abcdefgh
\end{textblock*}

\end{document}

在此处输入图片描述

答案1

\pdfsaveposTeX 编译器 pdfTeX (inventor)、LuaTeX 和 XeTeX 支持记录文件中绝对位置的功能.auxzref-savepos软件包模块zref提供了更简单的接口。位置以数字表示,单位为1sp

如果有固定位置可用于校正字符串“0123456789”的位置,则很有帮助。对于水平校正,使用水平分量不变的位置ABC和。012

如果是垂直校正,则更困难,因为对齐是在基线上,而垂直位置取决于第一行的高度。以下示例测量了第一段之前和文本块内基线之间的差异,并通过假设文本块从相同的垂直位置开始 ( 10cm) 来修复“0123456789”的垂直位置。

\documentclass{article}
\usepackage[absolute,overlay]{textpos}

\usepackage{zref-savepos}

\begin{document}
\begin{textblock*}{10cm}(5cm,5cm)
\noindent\vline
\hfill\begin{tabular}{l@{}}
  \zsavepos{ABC}%
  ABCDEFGHIJ\\
  ABCDEFGHIJKL\\
  ABCDEFGH
\end{tabular}
\vline
\end{textblock*}

\begin{textblock*}{10cm}(5cm,10cm)
  \kern\dimexpr
    \zposy{abc-pre}sp-\zposy{abc}sp
    -\zposy{012-pre}sp+\zposy{012}sp
  \relax
  \zsavepos{012-pre}%
  \noindent
  \zsavepos{012}%
  \kern\dimexpr\zposx{ABC}sp-\zposx{012}sp\relax
  0123456789 \vline
\end{textblock*}

% 10mm fixed to 10cm to avoid overfull \hboxes
\begin{textblock*}{10cm}(5cm,10cm)
  \zsavepos{abc-pre}%
  \noindent\vline
  \zsavepos{abc}abcdefghij\\
  abcdefghijkl\\
  abcdefgh
\end{textblock*}

\end{document}

结果

答案2

已经有两种很好的方法,但我想添加一种方法来说明 LaTeX3 团队在使用'棺材':带有多个手柄的框,用于布局设计。目前,这还不完美:我们可能需要在代码中添加一些概念,特别是采用“最大”宽度和绝对页面定位的垂直框(目前一切都是相对的)。

棺材方法的理念是我们可以使用某种形式的可理解的描述来创建设计布局。这里,我们有三个块(我将它们称为 A、B 和 C)。从示例中看,描述似乎如下。块 A(ABC...)排版为左对齐。块 B(012...)是单行,排版在块 A 下方恰好 5 厘米处(从上到上测量),没有水平偏移。块 C(abc...)排版在块 B 左侧恰好 5 厘米处(左边缘到左边缘),块 C 第一行的基线与块 B 的基线对齐。整个构造的定位使得封闭框的左上角位于页面上的(5 厘米,5 厘米)。这转化为

\documentclass{article}
\usepackage[absolute,overlay]{textpos}
\usepackage{xcoffins}
\NewCoffin{\CoffinA}
\NewCoffin{\CoffinB}
\NewCoffin{\CoffinC}
\begin{document}
\SetHorizontalCoffin{\CoffinA}{%
  \begin{tabular}{@{}l@{}}
    ABCDEFGHIJ\\
    ABCDEFGHIJKL\\
    ABCDEFGH
  \end{tabular}
}
\SetHorizontalCoffin{\CoffinB}{0123456789}
\JoinCoffins{\CoffinA}[t,l]{\CoffinB}[t,l](0 cm, -5 cm)
\SetVerticalCoffin{\CoffinC}{10 cm}{%
  \noindent
  abcdefghij\\
  abcdefghijkl\\
  abcdefgh
}
\JoinCoffins{\CoffinA}[\CoffinB-B,l]{\CoffinC}[T,l](-5 cm, 0 cm)
\begin{textblock*}{10cm}(5 cm, 5 cm)
  \noindent
  \TypesetCoffin{\CoffinA}%
\end{textblock*}
\end{document}

(还有其他订单我可以做同样的事情。)

在此处输入图片描述

答案3

也许使用几个实例tabular*

截屏

tabular*请注意额外的<width>与常规环境相比tabular

我过去常常\extracolsep{\fill}填充列之间的空间。只要您确保第二列p{<width>}具有相同的宽度,那么这将满足您的要求。

\documentclass{article}
\usepackage[absolute,overlay]{textpos}

\begin{document}
\begin{textblock*}{10cm}(5cm,5cm)
\noindent
\begin{tabular*}{\textwidth}{|l@{\extracolsep{\fill}}p{3cm}|}
  &ABCDEFGHIJ\\
  &ABCDEFGHIJKL\\
  &ABCDEFGH
\end{tabular*}
\vline
\end{textblock*}

\begin{textblock*}{10cm}(5cm,10cm)
\noindent
\begin{tabular*}{\textwidth}{|l@{\extracolsep{\fill}}p{3cm}|}
  abcdefghij    & 0123456789\\
  abcdefghijkl  &\\
  abcdefgh      &
\end{tabular*}
\end{textblock*}


\end{document}

相关内容