想要添加可选参数来调整 \mybox 的紧密度

想要添加可选参数来调整 \mybox 的紧密度

按照@Roman Starkov 的 \mybox 定义,得到一个紧密的 \fbox (如何在文本+数学环境周围放置一个框架),我想添加一个可选参数来调整 \fbox 内文本周围的 pt 余量。我尝试了以下 MWE,它作为独立命令运行,但 \mybox 命令在包含在我的较大项目中时不会运行:

\documentclass[12pt]{article}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\pagestyle{empty}

\usepackage{collectbox}

\makeatletter
\def\mybox{\@ifnextchar[{\@with}{\@without}}
\def\@with[#1]{%
    \collectbox{%
        \setlength{\fboxsep}{#1pt}%
        \fbox{\BOXCONTENT}%
    }%
}
\def\@without{%
    \collectbox{%
        \setlength{\fboxsep}{1pt}%
        \fbox{\BOXCONTENT}%
    }%
}
\makeatother


\begin{document}
\mybox{A rolling stone gathers no moss.} \par
. \par
\mybox[2]{A rolling stone gathers no moss.} \par
. \par
\mybox[3]{A rolling stone gathers no moss.} \par
\end{document}

上述 MWE 可以作为独立命令正常运行。但是,当包含在我的大型项目(超过 20k 行代码)中时,相同的代码会在代码行处导致以下错误:\mybox[2]{A rolling stone gathers no moss.} \par

失控的争论?!段落在@with完成之前就结束了。 \par

任何关于我可以做什么来调试的想法都将不胜感激。

抱歉,没有包含导致上述错误的上述代码版本。

仅供参考,我检查过我的大型项目中没有其他 \mybox 命令。

更新:

@user202729 和 @Simon Dispa:

我对您的解决方案进行了一些调整,以解决方框末尾字符被覆盖的问题。我一开始没有意识到这一点,所以我在 \fbox 后面添加了一个 ~,这似乎已经解决了这个问题。我还将默认 pt 余量设置为 2pt,因为它似乎能给我更多我最初想要的东西,同时仍允许我调整 pt 余量以适应方框文本和周围的段落。

感谢您的解决方案。以下是 \myNewBox 的最终代码:

\newcommand{\myNewBox}[2][]{\ifthenelse{\isempty{#1}}%
{\collectbox{\setlength{\fboxsep}{2pt}\fbox{#2}}~}%
{\collectbox{\setlength{\fboxsep}{#1pt}\fbox{#2}}~}%
 }

上述代码现在可以在我的更大的项目中完美运行!

答案1

也许更简单的命令定义将有助于避免冲突。

A

\documentclass[12pt]{article}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\pagestyle{empty}

\usepackage{collectbox}

\makeatletter
\def\mybox{\@ifnextchar[{\@with}{\@without}}
\def\@with[#1]{%
    \collectbox{%
        \setlength{\fboxsep}{#1pt}%
        \fbox{\BOXCONTENT}%
    }%
}
\def\@without{%
    \collectbox{%
        \setlength{\fboxsep}{1pt}%
        \fbox{\BOXCONTENT}%
    }%
}


\makeatother

\usepackage{xifthen} % added <<<<<<<<<<<<

\newcommand{\myNewBox}[2][]{\ifthenelse{\isempty{#1}}{\setlength{\fboxsep}{0pt}}{\setlength{\fboxsep}{#1pt}}%
    \fbox{#2}%
}


\begin{document}
    \mybox{A rolling stone gathers no moss.} \par
    . \par
    \mybox[2]{A rolling stone gathers no moss.} \par
    . \par
    \mybox[3]{A rolling stone gathers no moss.} \par
    
    \bigskip
    
    \myNewBox{A rolling stone gathers no moss.} \par
    . \par
    \myNewBox[2]{A rolling stone gathers no moss.} \par
    . \par
    \myNewBox[3]{A rolling stone gathers no moss.} \par
    
\end{document}

要在更大的项目中尝试添加\usepackage{xifthen}

\renewcommand{\mybox}[2][]{\ifthenelse{\isempty{#1}}{\setlength{\fboxsep}{0pt}}{\setlength{\fboxsep}{#1pt}}%
\fbox{#2}%
}

\begin{document}

相关内容