निरंजन
I want a border in standalone document class. This is a code that I found on TeX.SE in [this](https://tex.stackexchange.com/a/808/174620) answer, but apparently it doesn't work for \documentclass{standalone}.


\documentclass[border=6cm]{standalone}
\usepackage{pgf}
\usepackage{pgfpages}

\pgfpagesdeclarelayout{boxed}
{
\edef\pgfpageoptionborder{0pt}
}
{
\pgfpagesphysicalpageoptions
{%
logical pages=1,%
}
\pgfpageslogicalpageoptions{1}
{
border code=\pgfsetlinewidth{2pt}\pgfstroke,%
border shrink=\pgfpageoptionborder,%
resized width=.95\pgfphysicalwidth,%
resized height=.95\pgfphysicalheight,%
center=\pgfpoint{.5\pgfphysicalwidth}{.5\pgfphysicalheight}%
}%
}

\pgfpagesuselayout{boxed}
\begin{document}
Hello world
\end{document}


I have these requirements.
* Borders that can be added **after** the blank space provided by the optional argument border=xx to the documentclass.
* Multiple borders i.e. I shall be able to nest the borders by adding more on top of them.
* User defined widths.

Is there any package already available to achieve this?
Skillmon
You could get what you want (if I understood correctly) using \fbox and no additional packages:


\documentclass[border=3mm]{standalone}

\setlength\fboxsep{6cm}
\setlength\fboxrule{2pt}

\begin{document}
\fbox{Hello world}
\end{document}


![boxy_stuff-1.png](/image?hash=fa8a6a728503d493742cf65168b65fcc34935bdc3fb023393fd5fffff3e7801d)
user 3.14159
Here is a tcolorbox solution.

\documentclass[border=3mm]{standalone}
\usepackage{tcolorbox}
\begin{document}
\tcbox[colback=white,boxsep=6cm]{Hello world}
\end{document}

![Screen Shot 2020-08-10 at 11.21.24 AM.png](/image?hash=f648fb5bf2a5501b4b2c2a70b8d831ab5dcf1c8e1b798e37e42894d7c3c1f43b)

In its basic usage it is not too different from the [\fbox solution provided by Skillmon](https://topanswers.xyz/tex?q=1228#a1460), yet it is arguably much easier to customize. Apart from the rounded corners (which you can control with the arc key) you have a whole abundance of other ways to customize the output. For instance, you can change the distances arbitrarily with the top and so on keys (see p. 42 of the tcolorbox 4.30 manual), add shadows etc. The list of options is quite large, the tcolorbox manual has over 500 pages.

If you want to add several boxes in a document, each of which getting cropped and framed, you may want to use the \standaloneenv command and the hbox key.

\documentclass[border=3mm]{standalone}
\usepackage{tcolorbox}
\newtcolorbox{mybox}[1][]{hbox,colback=white,boxsep=6cm,#1}
\standaloneenv{mybox}
\begin{document}
\begin{mybox}
Hello world!
\end{mybox}

\begin{mybox}[toprule=2mm]
Hello ducks!
\end{mybox}
\end{document}

![ani.gif](/image?hash=1fa033f793f38395831388a97e66242a4a0a9885ea33aa38c1e6acfc76e32cd2)
Skillmon
# \multibox

The following provides code with which nested \fbox usages are generated. I use expkv-def and expkv-cs for this, but the basic approach doesn't depend on those two and could be created with most (if not all) key=val packages.

## Explanation

So what is the basic idea? We provide two sets of keys, the first is those defined with \ekvdefinekeys. They set the defaults and allow to change them (sep, rule, reset sep, reset rule) and call the next set of keys when you add a frame (add frame, set frame). The key add frames is only using the defaults and doesn't call the second key-set.

The next set of keys only contains the two keys sep and rule, it is defined with \ekvcSplitAndForward. These produce either the current defaults as defined in the first set of keys (stored in two dimen registers) or the arguments given by the user. They don't need to make assignments, which eases their usage. If we didn't use expkv-cs for those, we could use another set of dimen registers instead to temporarily store the user input.

All these keys from both sets are just to call \multibox@set with the correct arguments, and that one creates the nested \fbox structure stored in the macro \multibox@do. The third argument of \multibox@set is either \unexpanded{\usebox\multibox@box} (which means to drop the current box structure) or \unexpanded\expandafter{\multibox@do} (which means to add another box around the current box structure).

After one call to \multibox@set without resetting the box structure the macro \multibox@do will contain


\setlength\fboxsep{<sep1>}%
\setlength\fboxrule{<rule1>}%
\fbox{\usebox\multibox@box}%


a second call will result in


\setlength\fboxsep{<sep2>}%
\setlength\fboxrule{<rule2>}%
\fbox
{%
\setlength\fboxsep{<sep1>}%
\setlength\fboxrule{<sep2>}%
\fbox{\usebox\multibox@box}%
}%


and so on. Each \fbox creates a scope, so the changes to \fboxsep and \fboxrule of the inner \fboxes don't affect the outer ones.

Finally the output is aided by the grabbox package. All the macro call \@grabbox{}\multibox@box{}\hbox{}{\multibox@do\endgroup} does is to call something like


\newcommand\foo[1]
{%
\setbox\multibox@box\hbox{{#1}}%
\multibox@do
\endgroup
}


but all that without having to actually grab the box content as an argument. Instead it will be directly typeset into the box, so that \multibox@do can use the box contents by accessing the box register \multibox@box. For this last step there would also be alternatives. The easiest one would be to just grab the argument, another alternative would be the collectbox package, which does roughly the same as grabbox (a slightly different approach, iirc, and I wouldn't have written grabbox if I had known collectbox before).

As a result, the mandatory argument to \multibox *must* be enclosed by braces, else you'd get a missing { inserted error.

----

## Code

So with that lengthy explanation of the concept out of the way, here is the complete code:


\documentclass[border=3mm]{standalone}

\usepackage{expkv-def,expkv-cs}
\usepackage{grabbox}

\makeatletter
\newsavebox\multibox@box
\ekvdefinekeys{multibox}
{
\multibox@split{#1}{\unexpanded\expandafter{\multibox@do}}
,protect code set frame   =
\multibox@split{#1}{\unexpanded{\usebox\multibox@box}}
,default      set frame   = {}
,dimen        sep         = \multibox@sep
,initial      sep         = \fboxsep
,dimen        rule        = \multibox@rule
,initial      rule        = \fboxrule
,nmeta        reset       = { reset sep , reset rule , reset box }
,nmeta        reset sep   = sep  = \fboxsep
,nmeta        reset rule  = rule = \fboxrule
,noval        reset frame = \def\multibox@do{\usebox\multibox@box}
}
\ekvsetdef\multiboxSet{multibox}
\newcommand*\multibox@do{\usebox\multibox@box}
\ekvcSplitAndForward\multibox@split\multibox@set
{
long sep  = \multibox@sep
,long rule = \multibox@rule
}
\newcommand*\multibox@set[3]
{%
\edef\multibox@do
{%
\unexpanded{\setlength\fboxsep}{\the\dimexpr#1}%
\unexpanded{\setlength\fboxrule}{\the\dimexpr#2}%
\noexpand\fbox{#3}%
}%
}
{%
\expanded
{%
\unexpanded
{%
\count\z@=\z@
\loop\ifnum#1>\count\z@
\multibox@set
{\multibox@sep}%
{\multibox@rule}%
{\unexpanded\expandafter{\multibox@do}}%
\repeat
}%
\count\z@=\the\count\z@\relax
}%
}
\newcommand*\multibox[1][]
{%
\begingroup
\multiboxSet{#1}%
\@grabbox{}\multibox@box{}\hbox{}{\multibox@do\endgroup}%
}
\makeatother

\multiboxSet
{
,add frame  = {sep=5mm}           % add a custom box with default thickness
,add frame  = {rule=1cm}          % add a custom box with default sep
}

\begin{document}
\multibox
[
sep = 2pt                        % change the default sep
,rule = 3pt                       % change the default thickness
]
{Hello \verb|world|}
\end{document}


----

## Showcase

Since the above uses only \fbox, it can only produce boring boxes, but many of them at once.

![boxy_stuff-1.png](/image?hash=b30ae12dbe31bf62093b280dcfd916cbe0338064b23233e51ab699a1feb74522)

![boxy_stuff-2.png](/image?hash=77f21c6a90a0d23cfb4fa40c5a410eecd92cd506407db77acae830473f590c07)

![boxy_stuff-3.png](/image?hash=c81fe912b501bf5bd4545612c4ed151a1d0fb41116a5ea3c077d461c2f35ffbc)

![boxy_stuff-4.png](/image?hash=d213491ca9276d4a5beacf470414b42a2697eb23ae2bb4cd7d676771874143dd)

Enter question or answer id or url (and optionally further answer ids/urls from the same question) from

Separate each id/url with a space. No need to list your own answers; they will be imported automatically.