你好,TeX Stack Exchange,
我正在使用环境处理文档figure
,遇到了与\hfill
命令相关的布局问题。我的目标是tikzpicture
在图中均匀分布两个环境。我注意到,为了实现所需的间距,我需要\null
在最后一个命令后包含一个命令\hfill
。这是我的代码的简化版本:
\begin{figure}[htpb]
\centering
\hfill
% First tikzpicture environment
\begin{tikzpicture}[...]
% TikZ commands
\end{tikzpicture}
\hfill
% Second tikzpicture environment
\begin{tikzpicture}[...]
% TikZ commands
\end{tikzpicture}
\hfill\null
\caption{Prohibited lines}
\end{figure}
我的问题是:为什么\null
在第三个命令之后需要该命令\hfill
才能正确分配水平空间?如果没有,间距将无法按预期工作。第二张 tikz 图片的右侧没有空间。您能帮助我理解此上下文中和\null
的底层机制吗?\hfill
\null
谢谢您的帮助!
答案1
5 小时前此处的答案表明您不需要\hfill
因为在左侧和右侧\centering
插入。但它不包括您关于为什么需要在代码中插入 if 的问题的答案。是的,使用 会抑制隐式(从 插入,使用宏时 TeX 原始寄存器),因此我们必须查看s 在哪里以及(更重要的是)在处理段落时它们保留在哪里。\hfil
\null
\hfill
\hfill
\hfil
\leftskip
\rightskip
\centering
\hfill
在水平模式下调用时,TeX 会移除最后一个粘连(即\hfill
本例中) 。您通过插入第一个、第一个图像、第二个、第二个图像和最后一个来进入水平模式。所有这些材料都包含在水平列表中。然后宏在开始自己的打印之前运行。这会从水平列表中移除最后一个粘连,即最后一个。它会创建一个单行段落:、图像、、图像。\par
\hfill
\hfill
\hfill
\caption
\par
\par
\hfill
\hfill
\hfill
另一方面,如果\null
这里有(即\hbox{}
),那么水平列表包括\hfill
,图像,,\hfill
图像,,\hfill
。\hbox{}
现在,这个水平列表中的最后一项不是粘合项,因此下面的不会删除任何内容\par
。
我建议使用\hbox to\hsize
(即\centerline
来自纯 TeX)而不是 LaTeX 的\centering
宏。您可以控制要创建的框:
\hbox to\hsize{%
\hfil
first image
\hfil
second image
\hfil
}
当然,您可以替换此代码中所有出现的\hfil
by \hfill
,而不会发生任何改变。
答案2
你不需要\null
。永远。
在 的范围内\centering
,LaTeX\hfil
在两边都添加了胶水,因此你需要的只是\hfil
数字之间。
\documentclass{article}
\usepackage{lipsum}% just for context
\begin{document}
\lipsum[1][1-3]
\begin{figure}[htpb]
\centering
%%%% this is just for showing the spaces are equal
\rule{\dimeval{(\textwidth-8cm)/3}}{0.4pt}\hfill
\rule{\dimeval{(\textwidth-8cm)/3}}{0.4pt}\hfill
\rule{\dimeval{(\textwidth-8cm)/3}}{0.4pt}
\bigskip
%%%%
\framebox[4cm]{\rule{0pt}{3cm}}% <---
\hfil
\framebox[4cm]{\rule{0pt}{3cm}}
\caption{Prohibited lines}
\end{figure}
\lipsum[2][1-3]
\end{document}
一般来说,如果您希望水平空间不会被换行符所吞噬,请使用\hspace*
。 在您的例子中\hspace*{\fill}
可以这样做,但是,正如您上面看到的,解决方案更简单。