我想使用不带软件包的标准 LaTeX 将两个文本放在一个尺寸为 100*\textwidth 的框中,一个放在中间,一个放在顶部或底部。我使用tabular以下方法实现了此目的:

\documentclass{article}
\usepackage{xcolor}

\begin{document}
    
    \begin{center}
        \fbox{
            \parbox{\textwidth}{
                \centering\begin{tabular}{c}
                    \textbf{\large }\\[2cm]
                    \textbf{\huge This is a title}\\[2cm]
                    \textbf{\large This is a small text}
                \end{tabular}
            }
        }
    \end{center}
    
\end{document}

我想知道有没有更简单的方法?例如使用\parbox\raisebox?我尝试使用来生成它\parbox,但在添加第二个文本后,中心文本不再保持居中。使用时出现同样的问题vbox(我知道如何使用\phantom或修复它,\setbox但我正在寻找一种干净的方法)

\documentclass{article}
\usepackage{xcolor}

\begin{document}
    \fbox{ 
        \centering\vbox{\vskip 2cm
            \mbox{\textbf{\huge This is a title}}
            \vskip 2cm
            \mbox{\textbf{\large This is a subheading}}
        }
    }
\end{document}

4

  • 4
    除了 之外\vbox\vskip您的代码中没有任何内容是原始 TeX。我猜您的意思是没有软件包的标准 LaTeX。


    – 

  • 2
    您的第一个框比文本宽度宽得多,您必须收到超宽警告。


    – 

  • @DavidCarlisle 你说得对。但是测试一下还是可以的。:)


    – 

  • 4
    CFG 即使在测试时也最好%在行尾添加,否则@egreg 会很不高兴


    – 


5 个回答
5

图片模式(不仅适用于):

\documentclass{article}

\begin{document}


\noindent X\dotfill X

\noindent X\dotfill X

  \noindent
  \begin{picture}(0,100pt)
  \put(0,0){\framebox(\textwidth,100pt){\Large\bfseries This is a title}}
  \put(0,0){\makebox(\textwidth,100pt)[b]{\strut\small this is small text}}
  \end{picture}


\noindent X\dotfill X


\end{document}

2

  • 即使在测试时,最好在行尾添加 %,否则 @egreg 会非常不高兴:)


    – 

  • 3
    @CFG 这里没有缺失%(图片模式处理空白)


    – 

如果要使用,\parbox则应使用该宏的可选参数来指定目标高度和填充方法。然后,您可以将其包装\fbox起来:

\documentclass{article}

\begin{document}
\fbox
  {%
    \parbox[b][5cm][s]{\dimexpr\linewidth-2\fboxsep-2\fboxrule\relax}
      {%
        \centering
        \vfil
        {\bfseries\Large This is a title\par}%
        \vfil
        {\bfseries This is small text\par}%
      }%
  }
\end{document}


为了使文本完美地垂直居中,最简单的解决方案就是将与框底部相同的内容放在其顶部,但不可见。

\documentclass{article}

\begin{document}
\fbox
  {%
    \parbox[b][5cm][s]{\dimexpr\linewidth-2\fboxsep-2\fboxrule\relax}
      {%
        \centering
        \phantom{{\bfseries This is small text}}\par
        \vfil
        {\bfseries\Large This is a title\par}%
        \vfil
        {\bfseries This is small text\par}%
      }%
  }
\end{document}

5

  • 中心文本并非垂直居中。我说得对吗?


    – 

  • @CFG 不,不是。一定要这样吗?


    – 

  • 是的。这正是我的问题之一。


    – 

  • @CFG 完成。(更多字符)


    – 

  • 啊,你用了和\phantom我问题中提到的相同的技巧()。有没有直接的方法?例如,将第一个文本放在中间,然后添加第二个文本而不依赖于第一个文本?


    – 

以下使用原始 TeX(除了\centering、、\bfseries\strut\Large以及和\documentclass{article}\begin{document}\end{document}。此答案旨在提供教育,而不是用于 LaTeX 文档的生产性用途。

\documentclass{article}

\begin{document}
\vbox
  {%
    \hrule
    \noindent
    \vrule
    \vbox to 5cm
      {%
        \advance\hsize-.8pt % compensate for the two \vrule
        \centering
        \vfil
        {\bfseries\Large This is a title\strut\par}%
        \vfil
        {\bfseries This is small text\strut\par}%
      }%
    \vrule
    \hrule
  }
\end{document}

一个更加精简的版本,去掉\centering(显示的代码并不 100% 等同于 LaTeX 的\centering),并使文本垂直居中:

\documentclass{article}

\begin{document}
\vbox
  {%
    \hrule
    \noindent
    \vrule
    \vbox to 5cm
      {%
        \advance\hsize-.8pt % compensate for the two \vrule
        \leftskip=0pt plus 1fil
        \rightskip=0pt plus 1fil
        \parfillskip=0pt
        \parindent=0pt
        \setbox0\vbox{\bfseries This is small text\strut\par}%
        \vrule height \ht0 depth \dp0 width 0pt
        \vfil
        {\bfseries\Large This is a title\strut\par}%
        \vfil
        \box0
      }%
    \vrule
    \hrule
  }
\end{document}

以下是使用 Tikz 包来实现此目的的一种方式:

\documentclass[10pt,a4paper]{article}
\usepackage{tikz}

\begin{document}
 Just in case \dots\ 
 \tikz{
    \node[draw,font={\huge\bfseries},inner sep=25mm] (A) {This is a title};
    \node[anchor=south,font={\large}]       at (A.south) {This is small text};}
 \dots\ you liked some text here.
\end{document}

在哪里:

  • \tikz{ ... }tikzpicture是环境的缩写
  • 把它想象\node成一个标签,你可以把它放在
  • [draw,font={\huge\bfseries},inner sep=25mm]绘制形状;使用inner sep只是改变形状大小的一种可能性
  • 说出第一个\node[...] (A) {...};
  • 将第二个节点相对于它放置,即anchorsouth(中下)at A's south
  • 在这种简单的情况下,你不需要明确说明坐标,例如\node[...] (A) at (0,0) {...};
  • 我放了一些内联文本以供参考

2

  • 但是您需要加载一个包(而且是一个大包……=)


    – 

  • 这就是为什么它写在那里;-) // 建议分析无包要求……


    – 

例如使用 \parbox 和 \raisebox?

好吧,如果更简单的话,这是有争议的,但您可以将标题放在一个迷你页面中,使其在框中垂直和水平居中,然后使用它\raisebox在某个地方设置其他文本而不会影响标题位置。坏消息是底部或顶部文本的确切位置由您决定。

\documentclass{article}
\usepackage{xcolor}
\usepackage{lipsum}
\begin{document}
{\bfseries\centering\large 
\noindent\fcolorbox{blue}{cyan!05}{%
\begin{minipage}[c][5cm][c]{\dimexpr\linewidth-2\fboxsep-2\fboxrule}
\centering\huge This is a title
\end{minipage}}
\raisebox{.5cm}[0pt][0pt]{This is a small text at bottom}\par
\raisebox{5cm}[-5cm][-6cm]{This is a small text at top}\par}
\lipsum[1][1-5]
\end{document}