我来自 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 中没有浮动这样的东西。\vbox
0pt
floating
\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,
color
或fullpage
包来实现您想要的效果。设置边距最简单的方法是使用,就像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=top
或location=bottom
。
从内部来看,这与 Ryan Reich 给出的纯 TeX 解决方案相同;ConTeXt 只是在其周围提供了一个很好的键值驱动包装器。