有没有更简单的方法来浮动对象和设置边距?

有没有更简单的方法来浮动对象和设置边距?

我来自 HTML/CSS 背景,习惯于以特定的方式设置边距、浮动等。作为 TeX 的初学者,我很难定位元素,可能是因为我的思维方式仍然停留在 CSS 定位上,我还没有掌握 TeX 的方式。经过两个小时的努力,我现在或多或少设置了一个信头,我很快就想把它设置为背景(这是我刚刚学到的这里)。但我觉得我的代码花了太长时间(我正在学习,但仍然)编写和清理(我觉得我使用了错误的命令)。因此,为了更好地掌握定位,我想问一下我如何应该完成这个:

在此处输入图片描述

这是我在 HTML 中制作的,它应该是一封信的标题(此示例使用了占位符徽标)。从我的角度来看,这是我需要做的:

  • 创建具有特定高度和宽度的页面
  • 将文本设置为垂直居中显示,并与左侧保持一点距离
  • 将徽标浮动到右侧,与顶部和右侧留出一点空间

经过我的努力,这是我整理的代码:

\documentclass[a4paper]{article}
\usepackage{graphicx}
\graphicspath{{./img/}}
\usepackage{color}
\usepackage{xcolor}
\definecolor{grey}{HTML}{F4F4F4}
\definecolor{darkgrey}{HTML}{333333}
\usepackage{wrapfig}
\usepackage{fullpage}
\usepackage[margin=0.1cm, paperwidth=497pt, paperheight=40mm]{geometry}

\begin{document}

\pagecolor{grey}

\begin{wrapfigure}{r}{3cm}
\includegraphics[height=3cm]{html5}
\end{wrapfigure}

\Large \textcolor{darkgrey}{\\ \\ \textbf{Our Company} \\ Our Slogan}

\end{document}

这是我得到的:

在此处输入图片描述

我的问题:

  • 使用多个换行符使文本垂直居中。如果我使用vfill,我的徽标就会跳出来。
  • 徽标边框“粗糙”,而 HTML 版本中则很平滑。徽标分辨率高,如果我将 PDF 放大到 500%,则看起来不错,但在 100% 时看起来很糟糕。
  • 我浮动图片的方式感觉不对。浮动图片需要相当多的代码(记住,我来自float:right,所以我在这里有偏见,也许这个走的路)...应该这样吗?

任何其他关于更好地理解浮动和边距的提示都值得赞赏,尤其是考虑到这些类型的“设计”而不是文章和更标准的文本文档。

答案1

在 All(TeX) 中,就像在 html/css 中一样,所有内容都是一个框。当 Håkon Wium Lie 开发 CSS 时,他以 TeX 为基础建立了许多 CSS 概念(参见 Wium Lie 的博士论文)。

因此,为了跟踪代码的运行情况,我们将做两件事:首先将所有内容放入其自己的框中,其次使用 LaTeX 框住所有内容\fbox。TeX 提供两种主要类型的框 \hbox和。LaTeX 提供更多框,\vbox例如\parbox、等。\minipage\fbox

首先,您需要放置图像:

 \fbox{%
  \vbox to 0pt{\hbox to 12cm{\hfill \fbox{\includegraphics[height=3cm]{graphic}}}}
 }

在此处输入图片描述

html/css需要注意的重要一点是,它与在 a 中放置元素时使用的概念完全相同div,这就是为什么需要在 html 中clear清空。在 TeX 中,我们可以通过使用高度divs来实现相同的效果。可以使用 来实现向右移动。根据您放置命令的位置,图像可以“浮动”到左侧或右侧。使用将使其居中。但请记住,在 (La)TeX 中没有浮动这样的东西。\vbox0ptfloating\hfill\hfill\hfill\image commands\hfill

如果我们修改\vbox to 3.2cm,我们可以得到如下图像。不过这不会很有用,因为我们想将公司名称和口号放在“第 2 行”的开头。

在此处输入图片描述

从一般意义上讲,你可以认为\hbox\vbox与非常相似divs。将公司名称和口号放在类似的框中,我们可以得到以下内容。

在此处输入图片描述

我们可以使用 TeX 命令垂直移动元素\vskip,在上面的例子中,我们将其设置为零。将其设置为更合适的值,我们得到:

在此处输入图片描述

\fboxsep在最后一个例子中,我们通过将和设置为 0pt 将所有“填充”和“边框”设置为零\fboxrule

对于您可能多次遇到的代码,最好编写宏,而不是将所有内容都放在长语句中。这通常是一种良好的计算机编程,并且遵循 DRY 原则(不要重复自己)。

\def\addslogan#1{%
  \fbox{\kern2pt \sloganfonthook #1}
}

您所说的代码比 html/css/javascript 长,这值得怀疑。我理解您的心情float:right,但您忘记了必须清除divs等等,以及网络因浏览器不兼容而经历的痛苦,从切分所有内容并将其放在表格中开始,以及在 html/css 中几乎不可能垂直居中元素的方式。学习一门新的编程语言时,您需要花一点时间来发展自己的风格和基础知识。

最后是 MWE:

\documentclass[a4paper]{article}
\usepackage{graphicx}
\graphicspath{{./img/}}
%\usepackage{color}
\usepackage{xcolor}
\definecolor{grey}{HTML}{F4F4F4}
\definecolor{darkgrey}{HTML}{333333}
%\usepackage{wrapfig} not needed
%\usepackage{fullpage} not needed
\usepackage[paperwidth=130mm,top=10pt, paperheight=130mm,left=0.5cm,right=0.5cm]{geometry}
\parindent0pt

\def\addslogan#1{%
  \fbox{\kern2pt \sloganfonthook #1}
}

\def\sloganfonthook{\large\sffamily \color{darkgrey}}
\begin{document}
\pagecolor{grey}
\fboxsep0pt
\fboxrule0pt

\fbox{\vbox to 0pt{\hbox to 12cm{\hfill \fbox{\includegraphics[height=3cm]{image}}}}}
\vskip30pt
\fbox{\vbox{\fbox{\Large\textcolor{darkgrey}{\textbf{OUR COMPANY Inc.}}}\par
}}

\addslogan{Everything  about typesetting with \TeX\ and friends}
\end{document}

最后要说的是,您不需要wrapfig, colorfullpage包来实现您想要的效果。设置边距最简单的方法是使用,就像geometry您所做的那样。

答案2

正如其他答案所解释的那样,TeX 有一个模型,通过该模型,您可以将框放在框内并以某种方式完成定位。对于一般图形来说,这并不是很令人满意,尽管在实践中,只要付出足够的努力,你基本上可以做任何事情。

LaTeX 在此基础上添加了一个picture环境,您可以在其中根据某些底层的“图形坐标系统”进行定位。同样,这并不是您示例中真正想要的,因为必须以某种方式计算图形中每个对象的坐标位置。

您真正想要的是指定对象之间的关系,例如,对象 A 的右侧中心与对象 B 的左下方对齐,并偏移一些空间,等等。

LaTeX3 方法

因此,在看过普通的 TeX 和 LaTeX 解决方案后,让我为您提供 LaTeX3 解决方案,称为“棺材”:棺材是一个带有大量把手的盒子,您可以参考并与其他棺材上的把手对齐。使用这种方法,您的问题的解决方案可能如下所示:

\documentclass{article}

\usepackage{xcolor} \definecolor{darkgrey}{HTML}{333333}

\usepackage{xcoffins}

\begin{document}

  \NewCoffin \result
  \NewCoffin \aaa
  \NewCoffin \bbb
  \NewCoffin \ccc
  \NewCoffin \ddd

\SetHorizontalCoffin \result {}

\SetHorizontalCoffin \aaa {\Large\color{darkgray}\bfseries Our Company}
\SetHorizontalCoffin \bbb {\Large\color{darkgray}\bfseries Our Slogan}
\SetHorizontalCoffin \ccc  {\color{red}\rule{1.5cm}{3cm}}
\SetHorizontalCoffin \ddd {\small\color{blue}\sf\bfseries HTML}

% put \aaa into \result
\JoinCoffins \result \aaa

% align bottom-right of \aaa with top-right of \bbb (with 8pt vertical offset)
\JoinCoffins \result [\aaa-b,\aaa-r]  \bbb [t,r](0pt,-8pt)

% align vertical-center-left of current \result with vertical-center-right of \ccc (offset by \textwidth)
\JoinCoffins \result [vc,l]  \ccc [vc,r](\textwidth,0pt)

% center the word HTML directly on top of the logo 
\JoinCoffins \result [\ccc-t,\ccc-hc] \ddd [b,hc]

\noindent\TypesetCoffin \result

some sample text some sample text some sample text some sample text some sample text

\end{document}

这将导致以下结果:

在此处输入图片描述

这里有几点说明:

  • 由于只需放置两三个物体,因此比其他一些解决方案需要多做一些工作。
  • 然而,它具有内在的灵活性,可以轻松改变各个方面的设计。
  • 我故意把口号放在右边,只是为了展示你可以多么轻松地改变你的设计
  • 结果是一个文本对象,解释了需要\noindent
  • expl3 的 coffins 实现已经稳定。但是用户级界面尚未稳定!目前我们有两种选择,一种带有 keyval 系统,一种仅带有可选参数,我在上面使用了后者。但这两种方法都可能得到改进,特别是在我们收到实际使用它进行“设计”的人的反馈之后。

作为一个预告,我想展示一张 Tschichold 1925 年杂志的封面,我用棺材重新制作了它我的谈话2010 年 TUG 会议上介绍了他们。

我对那些尝试使用普通 TeX 盒子模型方法来做到这一点的人感兴趣:

在此处输入图片描述

这是通过设置 10 个棺材并将它们在正确的手柄处连接在一起(即 10 个连接命令)来实现的。

答案3

以下是一个相当简单的 TeX 实现方法。我删除了所有内容,只留下了必需的部分。

\documentclass{article}
\usepackage{graphicx}

\begin{document}

\hbox to \textwidth{%
 \hskip 2mm% For some space on the left
 \vbox to 3cm{%
  \vfil
  \hbox{\textbf{Our company}}
  \hbox{Our Slogan}
  \vfil
 }%
 \hfil
 \includegraphics[height=3cm]{html5}%
 \hskip 2mm% For some space on the right
}

\end{document}

我很抱歉没有在 LaTeX 中以“正确”的方式进行操作;不幸的是,我不太擅长使用普通 TeX 装箱和间距结构的 LaTeX 变体。

至于徽标粗糙的问题:如果它在更高的分辨率下工作,我怀疑这只是查看器缩放比例的限制。图形经常出现这种情况。

编辑:也许我应该评论一下,你对“float”一词的期望与它在 TeX 中的用法不太一样。特别是,“float:right”就像\hfil(l)(l)(虽然如果你想让文本环绕它,它会变得非常糟糕;因此wrapfig,正如你毫无疑问发现的那样)。TeX 中的“float”不仅垂直浮动,而且在页面之间浮动。对于具有绝对定位的信头之类的东西来说,使用它并不合适,而对于显示文本引用但不一定与其流同步的数据的图形或表格(如同名的 LaTeX 环境)来说则更合适。

答案4

正如其他人指出的那样,在 TeX 术语中,您想要实现的不是浮点数。ConTeXt 提供了一个combinations并排放置对象的环境。这主要用于子浮点数,但对于此示例也适用。

\definecombination[logo] 
                  [
                    distance={1pt plus 1fill},
                    location=middle,
                    width=\textwidth,
                  ]

\startbuffer[company-details]
\framed[frame=off, align=normal]
  {{\bfb Company Name} \crlf
    Company slogan
  }
\stopbuffer


\starttext
\startcombination[logo]
  {\getbuffer[company-details]}{}
  {\externalfigure[http://placekitten.com/g/200/300][method=png]}{}
\stopcombination
\stoptext

这使

在此处输入图片描述

主要思想是设置distance={1pt plus 1fill}。这允许两个对象之间的空间扩大,直到总空间等于\textwidth(使用 设置width=\textwidth)。

location=middle确保徽标文本和徽标图像垂直居中。如果您希望徽标顶部对齐或底部对齐,可以设置location=toplocation=bottom

从内部来看,这与 Ryan Reich 给出的纯 TeX 解决方案相同;ConTeXt 只是在其周围提供了一个很好的键值驱动包装器。

相关内容