如何制作这样的盒子?

如何制作这样的盒子?

我想要自定义命令来制作看起来像Wolfram|Alpha中的实体数学笔记本:

\LinguisticAssistant{france}
\Entity{France}{country}

在此处输入图片描述 在此处输入图片描述

我已经完成了查找颜色的工作,并在代码中定义了它们。字体如下: - LinguisticAssistant:(第一个带有橙色等号的框)使用 Ariel - Entity:使用粗体,然后使用较小的全大写 Helvitica。

这是我目前所拥有的:

\documentclass{article}
\usepackage{pstricks}
\usepackage{xcolor}
\definecolor{lightyellow}{RGB}{255, 250, 236}
\definecolor{textdark}{RGB}{100, 52, 20}
\definecolor{borderorange}{RGB}{253, 129, 36}
\definecolor{lightgray}{RGB}{214, 214, 214}
\definecolor{countrygray}{RGB}{153, 153, 153}
\begin{document}
\begin{pspicture}(5,5)
  \psset{fillstyle=solid, framearc=.4, linecolor=borderorange, linewidth=.8pt}
  \psframebox[fillcolor=lightyellow]{\textcolor{textdark}{France}  \textcolor{countrygray}{COUNTRY}}
\hspace{1cm}
  \psset{fillstyle=solid, framearc=.2, linecolor=lightgray, linewidth=.4pt}
  \psframebox[fillcolor=white]{\textcolor{black}{france}}
\end{pspicture}
\end{document}​

在此处输入图片描述

但我仍然不知道如何:

  • 画小等号
  • 缩放/格式化文本,使其看起来就像图像一样

我现在正在看这个包tcolorbox,不确定它是否比 pstricks 更容易或更好。

更新:

我把等号图标做成了小pdf

答案1

我已经有一段时间没用过了pstricks,所以我会把这个问题留给别人来解决。另外,我不太会使用tcolorbox。所以,这个问题我也会留给别人来解决。但是,我会向你展示如何从 TikZ 中做到这一点

这个答案分为五个部分:

  • 如何盒子France COUNTRY。这是最直接的。
  • 如何盒子Equal france。我在这里使用了一些更微妙的技巧。
  • 使用 RGB 规范定制您自己的颜色。
  • 使用您自己的图像文件创建Equal france 盒状结果
  • 使用宏实现

“法国国家”盒子

在此处输入图片描述

\documentclass[tikz,border=6pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}

\newcommand\makegray[1]{\color{gray}{#1}}
\begin{document}

\begin{tikzpicture}

  \node[rounded corners,
        draw=orange,
        fill=orange!25,text=black,font=\sffamily]
       {France \makegray{COUNTRY}};

\end{tikzpicture}

\end{document}

“平等的法国”盒子

在此处输入图片描述

\documentclass[tikz,border=6pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{fit}

\newcommand\makegray[1]{\color{gray}{#1}}

\newsavebox\aeequalsign
\begin{lrbox}\aeequalsign
  \begin{tikzpicture}[x={(4pt,0)},
                      y={(0,4pt)}]
    \fill[orange] (0,0) rectangle (5,3);
    \draw[white,line width=2pt] (1,1) -- ++ (3,0);
    \draw[white,line width=2pt] (1,2) -- ++ (3,0);
  \end{tikzpicture}
\end{lrbox}

\begin{document}

\begin{tikzpicture}

  \node[inner sep=0pt]            (AEEQUAL)                  {\usebox{\aeequalsign}};
  \node[anchor=west,
        font=\sffamily\bfseries]  (FRANCE) at (AEEQUAL.east) {france};
  \node[fit=(AEEQUAL) (FRANCE),inner ysep=5pt,inner xsep=0pt] (COMBINED) {};
  \draw[rounded corners=4pt]
        (AEEQUAL.north) |- (COMBINED.north east)
                        -- (COMBINED.south east) -| (AEEQUAL.south);

\end{tikzpicture}

\end{document}

颜色:

如果您不喜欢我的颜色,您可以定义自己的颜色,就像pstricks使用\definecolor提供的宏一样xcolor(它会自动加载 TikZ)。

\definecolor{<color name>}{rgb}{<decimal>,<decimal>,<decimal>}
\definecolor{<color name>}{RGB}{<int>,<int>,<int>}

以下是 TikZ 中的实现:

\tikzset{define color/.code 2 args={\definecolor{#1}{RGB}{#2}}}

然后你可以写

\begin{tikzpicture}
  [
    define color={borderorange}{253,129,36},
    define color={lightyellow}{255,250,236},
  ]

  \node[rounded corners,
        draw=borderorange,
        fill=lightyellow,text=black,font=\sffamily\bfseries]
       {France \makegray{COUNTRY}};

\end{tikzpicture}

包括图像文件:

如果您有一个想要包含的图像文件,这很简单。

在此处输入图片描述

只需将上面的等号代码重新利用如下:

\newsavebox\aeequalsign
\begin{lrbox}\aeequalsign
  \includegraphics[width=2em]{image/no_you_cant}
\end{lrbox}

用于文本内实现的宏

我已经创建了你的宏

\LinguisticAssitant
\Entity

让您更轻松地创建如下所示的内容:

在此处输入图片描述

我还添加了几个功能:特别是,我考虑到这些功能可能会在线使用(如上图所示),因此我设置了基线为了形象的以匹配文本基线。此外,我还添加了以下行到\LinguisticAssistant

\path (COMBINED.north) ++ (0,\lineskip) node[inner sep=0pt] {};

这应该可以避免该图像与其上方的线条相撞。

你也可以在底部添加类似的东西

\path (COMBINED.south) ++ (0,-\lineskip) node[inner sep=0pt] {};

如果您想在图像下方添加更多空间。但是,我还没有用此代码做到这一点。此外,您可以调整inner sep以创建更严格的空间。

这是使用以下方式执行的

\documentclass{article}
\usepackage{lipsum}

\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{fit}

\newcommand\makegray[1]{\color{gray}{#1}}

\newsavebox\aeequalsign
\begin{lrbox}\aeequalsign
  \includegraphics[height=3ex]{image/no_you_cant}
\end{lrbox}

\tikzset{define color/.code 2 args={\definecolor{#1}{RGB}{#2}}}
\tikzset{define color={borderorange}{253,129,36},
         define color={lightyellow}{255,250,236},
        }

\newcommand\Entity[2]{%%
  \begin{tikzpicture}[baseline={(EQUALITY.base)}]
    \node[rounded corners,
          draw=borderorange,
          fill=lightyellow,text=black,font=\sffamily\bfseries]
         (EQUALITY)
         {#1 \makegray{#2}};
  \end{tikzpicture}}

\newcommand\LinguisticAssistant[1]{%%
\begin{tikzpicture}[baseline={(FRANCE.base)}]
  \node[inner sep=0pt]            (AEEQUAL)                  {\usebox{\aeequalsign}};
  \node[anchor=west,
        font=\sffamily\bfseries]  (FRANCE) at (AEEQUAL.east) {#1};
  \node[fit=(AEEQUAL) (FRANCE),inner ysep=5pt,inner xsep=0pt] (COMBINED) {};
  \draw[rounded corners=4pt]
        (AEEQUAL.north) |- (COMBINED.north east)
                        -- (COMBINED.south east) -| (AEEQUAL.south);
  \path (COMBINED.north) ++ (0,\lineskip) node[inner sep=0pt] {};
\end{tikzpicture}}


\begin{document}

  \LinguisticAssistant{ARMA} \Entity{virumque}{cano}, Troiae qui primus ab oris
  Italiam, fato profugus, Laviniaque venit
  litora, multum ille et terris iactatus et alto
  vi superum saevae memorem Iunonis ob iram;
  multa quoque et bello passus, dum conderet urbem,
  inferretque deos Latio, genus unde Latinum,
  Albanique patres, atque altae moenia Romae.

  \LinguisticAssistant{Musa}, \Entity{mihi}{causas memora}, quo numine laeso,
  quidve dolens, regina deum tot volvere casus
  insignem pietate virum, tot adire labores
  impulerit.  Tantaene animis caelestibus irae?

  \LinguisticAssistant{Urbs} \Entity{antiqua}{fuit}, Tyrii tenuere coloni,
  Karthago, Italiam contra Tiberinaque longe
  ostia, dives opum studiisque asperrima belli;
  quam Iuno fertur terris magis omnibus unam
  posthabita coluisse Samo; hic illius arma,
  hic currus fuit; hoc regnum dea gentibus esse,
  si qua fata sinant, iam tum tenditque fovetque.
  Progeniem sed enim Troiano a sanguine duci
  audierat, Tyrias olim quae verteret arces;
  hinc populum late regem belloque superbum
  venturum excidio Libyae:  sic volvere Parcas.
  Id metuens, veterisque memor Saturnia belli,
  prima quod ad Troiam pro caris gesserat Argis---
  necdum etiam causae irarum saevique dolores
  exciderant animo:  manet alta mente repostum
  iudicium Paridis spretaeque iniuria formae,
  et genus invisum, et rapti Ganymedis honores.
  His accensa super, iactatos aequore toto
  Troas, reliquias Danaum atque immitis Achilli,
  arcebat longe Latio, multosque per annos
  errabant, acti fatis, maria omnia circum.
  Tantae molis erat Romanam condere gentem!

\end{document}

答案2

解决方案pstricks如下。MWE 展示了四种尝试:1. 默认无衬线字体,矩形等号框;2. 使用 Helvetica,带圆角的方形等号框;3. 使用 OP 提供的等号框图像;4. 通过调整 PSTricks 坐标将其内联到段落中。

\documentclass{article}
\usepackage{pstricks}
\usepackage{xcolor}
\usepackage{helvet} % attempt 2
\usepackage{graphicx} % attempt 3
\definecolor{lightyellow}{RGB}{255, 250, 236}
\definecolor{textdark}{RGB}{100, 52, 20}
\definecolor{borderorange}{RGB}{253, 129, 36}
\definecolor{lightgray}{RGB}{214, 214, 214}
\definecolor{countrygray}{RGB}{153, 153, 153}
\begin{document}
\begin{pspicture}(5,5)
  \psset{fillstyle=solid, framearc=.4, linecolor=borderorange, linewidth=.8pt}
  \rput[l](0,1){\psframebox[fillcolor=lightyellow]{\textcolor{textdark}{\textsf{\textbf{France}}}  \textcolor{countrygray}{\footnotesize\textsf{COUNTRY}}}}

  \psset{fillstyle=solid, framearc=.2, linecolor=lightgray, linewidth=.4pt}
  \rput[l](0.15,2){\psframebox[fillcolor=white]{\textcolor{black}{\textsf{\phantom{.}france}}}} % attempt 1: \phantom{x}
  % \psset{framearc=.5} % attempt 2
  % \rput[l](0,1){\psframebox[fillcolor=orange,framesep=1pt]{\vphantom{|}\tiny\textcolor{white}{\raisebox{1.2pt}{=}}}} % attempt 1: framesep 2pt
  \rput[l](0,2){\includegraphics[width=3mm]{small-equals-icon.eps}} % attempt 3
\end{pspicture}

% attempt 4
\newcommand\LinguisticAssistant[2]{%%
\begin{pspicture}(#2,0.4)
  \psset{fillstyle=solid, framearc=.2, linecolor=lightgray, linewidth=.4pt}
  \rput[l](0.15,0.1){\psframebox[fillcolor=white]{\textcolor{black}{\textsf{\phantom{.}#1}}}}
  \rput[l](0,0.1){\includegraphics[width=3mm]{small-equals-icon.eps}}
\end{pspicture}
}

hic currus fuit; hoc regnum dea gentibus esse,
si qua fata sinant, iam tum tenditque fovetque.
Progeniem sed enim Troiano \LinguisticAssistant{France}{1.5}
a sanguine duci audierat, Tyrias olim quae verteret arces;
hinc populum late regem belloque superbum
venturum excidio Libyae:  sic volvere Parcas.
Id metuens, veterisque memor Saturnia belli,
prima quod ad Troiam pro caris gesserat Argis---
necdum etiam causae irarum 

\end{document}

尝试 1:

在此处输入图片描述

尝试2:

在此处输入图片描述

尝试3:

在此处输入图片描述

尝试4:

在此处输入图片描述

定位是使用\rput坐标完成的。这样可以将带有 的框=(尝试 1 和 2)或包含的图形(尝试 3 和 4)放置在带有 的框的顶部france。框中的文本已使用幻像字母(未打印,但考虑到它是“真实的”时会占用的空间)稍微向右移动。带有 = 符号的框(尝试 1 和 2)的边距稍小(2pt对于尝试 1)以看起来更像原始图片。在尝试 2 中,框更方形,使用framesep=1pt和垂直幻像|,带有 的圆角framearc=.5,带有 的等号略微凸起\raisebox。字体为无衬线,使用\textsf(与第二个法国的粗体结合使用\textbf),对于尝试 2、3、4 设置为 Helvetica \usepackage{helvet}。文本COUNTRY变小以\footnotesize模拟小型大写字母。

在尝试 3 和 4 中,\framebox等号被替换为\includegraphics,这需要\usepackage{graphicx}。如果使用编译序列,latex-dvips-ps2pdf则需要将 pdf 图像转换为eps,例如在 Linux 中使用pdftops -eps small-equals-icon.pdf。如果xelatex在编译中使用,则无需转换,但在这种情况下,需要采用不同的方法来使用类似 Helvetica 的字体。

可以pspicture在段落中内联使用,无需进一步调整。但是,分配给图片的空间取决于为图片指定的大小以及图片内元素的坐标。在 MWE 中,图片(5,5)对于内容来说太大,并且由于使用的坐标,元素部分绘制在图片区域之外。因此,调整大小和坐标可以创建合适的内联图片。MWE 展示了第一张图片的想法,调整第二张图片留给读者练习。由于内联图片的宽度可能不同,因此已将其作为参数添加到\LinguisticAssistant

但是,使用 TikZ 进行这种绘图可能会更容易,另请参阅其他答案。

答案3

有人提到过吗tcolorbox

\documentclass{article}
\usepackage[most]{tcolorbox}
\usepackage{helvet}

\definecolor{lightyellow}{RGB}{255, 250, 236}
\definecolor{textdark}{RGB}{100, 52, 20}
\definecolor{borderorange}{RGB}{253, 129, 36}
\definecolor{lightgray}{RGB}{214, 214, 214}
\definecolor{countrygray}{RGB}{153, 153, 153}

\newcommand{\Entity}[3][]{%
    \tcbox[colframe=borderorange, colback=lightyellow, 
        nobeforeafter, tcbox raise base, 
        boxsep=0mm, left=2mm, right=2mm, arc=.4mm,
        fontupper=\sffamily, #1]{%
        \textcolor{textdark}{\bfseries #2}%
        \ \textcolor{countrygray}{#3}}%
}

\newcommand{\LinguisticAssistant}[2][]{%
    \tcbox[enhanced, 
        colframe=lightgray, colback=white, 
        nobeforeafter, tcbox raise base, 
        boxsep=0mm, left=2mm, right=2mm, arc=.2mm, 
        enlarge left by=1.5mm, 
        fontupper=\sffamily, 
        overlay={\node[inner sep=0pt, outer sep=0pt] at (frame.west) {\includegraphics[width=3mm]{small-equals-icon}};},
        #1]{#2}%
}

\begin{document}

\Entity{France}{COUNTRY}
\LinguisticAssistant{france}


The \texttt{Entity} box looks like \Entity{France}{COUNTRY} and this one, \LinguisticAssistant{france},  is called \texttt{LinguisticAssistant}.
\end{document}​

在此处输入图片描述

相关内容