如何将水平堆叠的物品与上方物品重新对齐

如何将水平堆叠的物品与上方物品重新对齐

考虑 MWE

\documentclass{article}
\textheight 8.25in \textwidth 4.75in
\usepackage{scalefnt}
\usepackage{amsmath,amssymb}

%\blacksquare\hspace*{.7em}
\usepackage{stackengine,xcolor,lipsum}
\let\svitem\item
\newcommand\difbox[1]{\stackengine{0pt}{\color{white}\rule{5ex}{1.15ex}}{%
    $\iftrue\makeballs#1\fi$}{O}{c}{F}{F}{L} }
\def\makeballs#1#2\fi{\fi\ifx R#1\textcolor{red}{\blacksquare}\else
  \ifx B#1\textcolor{blue!35}{\blacksquare}\fi\fi%
  \ifx\relax#2\relax\else\makeballs#2\fi}
\newenvironment{benumerate}
{\renewcommand\item[1][1]{\def\difficulty{##1}\svitem}%
  \def\labelenumi{\smash{\stackunder[5pt]{\color{blue!65!black}%
  \bfseries\sffamily\theenumi}{\expandafter\difbox\expandafter{\difficulty}}}}%
  \enumerate}{\endenumerate}

\begin{document}
\large
\begin{benumerate}
\setcounter{enumi}{0}
\item[RBRRBR] \lipsum[11]
\item[RRR] \lipsum[39]
\item[BRRRB] \lipsum[13]
\end{benumerate}
\end{document}

带输出

在此处输入图片描述

我想扩大彩色方块之间的间隙;但是当我将两个实例都替换\blacksquare\blacksquare\hspace*{.7em}--- 时,我得到了我想要的额外间距,但相对于上面的枚举,新的水平堆栈似乎没有对齐;即,没有位于上述数字下方的中心,如下所示:

在此处输入图片描述

现在,第一个输出中的对齐并不完美,但相当准确。然而,第二个输出中的对齐显然没有在相应数字下方居中。

问题:我怎样才能增加原始输出的彩色框之间的间隙,以便彩色方块的水平堆栈合理地位于上方数字的正下方?

谢谢。

答案1

您可以\unskip在末尾使用来删除导致偏移的尾随空格:

\documentclass{article}
\textheight 8.25in \textwidth 4.75in
\usepackage{scalefnt}
\usepackage{amsmath,amssymb}

\usepackage{stackengine,xcolor,lipsum}
\let\svitem\item
\newcommand\difbox[1]{\stackengine{0pt}{\color{white}\rule{5ex}{1.15ex}}{\makeballs{#1}}{O}{c}{F}{F}{L}}

\newcommand\makeballs[1]{$\iftrue\makeballsA#1\fi \unskip$}
\def\makeballsA#1#2\fi{\fi
  \ifx R#1\textcolor{red}{\blacksquare}\else
  \ifx B#1\textcolor{blue!35}{\blacksquare}\fi\fi \hspace{.7em}%
  \ifx\relax#2\relax \else\makeballsA#2\fi}
  
\newenvironment{benumerate}
{\renewcommand\item[1][1]{\def\difficulty{##1}\svitem}%
  \def\labelenumi{\smash{\stackunder[5pt]{\color{blue!65!black}%
  \bfseries\sffamily\theenumi}{\expandafter\difbox\expandafter{\difficulty}}}}%
  \enumerate}{\endenumerate}

\begin{document}
\large
\begin{benumerate}
\setcounter{enumi}{0}
\item[RBRRBR] \lipsum[11]
\item[RRR] \lipsum[39]
\item[BRRRB] \lipsum[13]
\end{benumerate}
\end{document}

在这里我将其抽象\makeballs为一个单独的宏,以便可以在其他地方重复使用,而不必关注实际的工作细节。

此外,这里必须使用\hspace(无星号)或,因为会添加中间框。\hskip\hspace*


附录:另一种方法是仅在有下一次迭代时才添加空格。

\newcommand\makeballs[1]{$\iftrue\makeballsA#1\fi$}
\def\makeballsA#1#2\fi{\fi
  \ifx R#1\textcolor{red}{\blacksquare}\else
  \ifx B#1\textcolor{blue!35}{\blacksquare}\fi\fi
  \ifx\relax#2\relax \else\hspace{.7em}\makeballsA#2\fi}

相关内容