Zentrieren von Tikz-Bildern innerhalb einer Tcolorbox

Zentrieren von Tikz-Bildern innerhalb einer Tcolorbox

Diese Frage ist eine Erweiterung meinerletzte FrageUndeine Antwortvon @frougon.

Ich habe den Code der Antwort ein wenig bearbeitet, um ihn meinen Bedürfnissen anzupassen, aber die wichtigen Teile bleiben erhalten (so hoffe ich).

Ich habe imagesAltund erstellt questionpictureAlt, wodurch die enumerateUmgebung entfernt wird und ich meine Tikzpictures direkt in mein Dokument einfügen kann, ohne dass eine Aufzählung erforderlich ist. Es funktioniert bisher ziemlich gut.

Das Problem, das ich habe, ist, dass die Tikz-Bilder nicht ganz auf der Seite zentriert sind. Ich bin mir nicht sicher, ob das an den Änderungen liegt, die ich an Frougons Antworten vorgenommen habe, oder ob es etwas mit dem tcolorboxPaket zu tun hat, das ich verwende (ich glaube nicht, dass das der Fall ist), oder etwas anderes.

Unten ist mein Code/meine Ausgabe, wo ich farbige Linien eingefügt habe, wobei jede Farblinie gleich lang ist, um zu zeigen, dass die Dinge nicht richtig zentriert sind.

\documentclass{article}
\usepackage{graphicx}
\usepackage{calc} % for \settototalheight (used for convenience)
\usepackage{xcolor}
\usepackage{etoolbox}
\usepackage{xparse}
\usepackage{tikz}
\usepackage{parskip}
\usepackage{enumitem}
\usetikzlibrary{calc}


% Frame dimensions
\newlength{\mywidth}
\newlength{\myheight}
\setlength{\mywidth}{3.5cm}
\setlength{\myheight}{3.5cm}

\makeatletter

% l3keys supports a key/value-style interface for the optional argument of the 'images' environment.
\ExplSyntaxOn

\msg_new:nnn { form } { duplicate-figure-id }
  { duplicate~figure~identifier:~'\exp_not:n {#1}'. }

% Whether to perform the \scalebox-based autoscaling for a given figure
\bool_new:N \l__form_do_autoscale_pic_in_images_bool
% Sequence recording all figure identifiers (for the 'scale to max size' TikZ style) found so far
\seq_new:N \g__form_scale_to_max_style_figure_ids_seq
% Counter used when generating automatic figure identifiers for 'form autoscale'
\int_new:N \g_form_last_autogenerated_figure_nb_int

% Define the options supported in the optional argument of the 'images' environment
\keys_define:nn { form }
  {
    autoscale .bool_set:N = \l__form_do_autoscale_pic_in_images_bool,
    % Value used when the 'autoscale' key is passed with no value
    autoscale .default:n = { true },
    autoscale .initial:n = { false }
  }

\cs_new_protected:Npn \__form_set_keys:n #1
  { \keys_set:nn { form } {#1} }

\cs_new_protected:Npn \__form_check_unique_id:n #1
  {
    \seq_if_in:NnTF \g__form_scale_to_max_style_figure_ids_seq {#1}
      { \msg_error:nnn { form } { duplicate-figure-id } {#1} }
      { \seq_gput_right:Nn \g__form_scale_to_max_style_figure_ids_seq {#1} }
  }

\cs_new_protected:Npn \__form_form_autoscale:n #1
  {
    \pgfkeys { /tikz/.cd, form~autoscale={#1} }
  }

\cs_generate_variant:Nn \__form_form_autoscale:n { V }

% Automatic construction of generated ids (the pattern is defined here)
\cs_new:Npn \__form_autogenerated_id:n #1
  { form~autogenerated~id~#1 }

\cs_generate_variant:Nn \__form_autogenerated_id:n { V }

\cs_new_protected:Npn \__form_form_autoscale_autoid:
  {
    % Increment the counter
    \int_gincr:N \g_form_last_autogenerated_figure_nb_int
    \tl_set:Nx \l_tmpa_tl       % generate an ID based on the counter value
      {
        \__form_autogenerated_id:V
          \g_form_last_autogenerated_figure_nb_int
      }
    % Call the 'form autoscale' style with the new ID
    \__form_form_autoscale:V \l_tmpa_tl
  }

% Set up aliases using LaTeX2e naming style
\cs_set_eq:NN \formsetup \__form_set_keys:n
\cs_set_eq:NN \form@check@unique@id \__form_check_unique_id:n
\cs_set_eq:NN \form@form@autscale@autoid \__form_form_autoscale_autoid:

% If-then-else command using the boolean
% \l__form_do_autoscale_pic_in_images_bool to choose the branch
\NewDocumentCommand \form@ifautoscale@enabled { }
  {
    \bool_if:NTF \l__form_do_autoscale_pic_in_images_bool
  }

\ExplSyntaxOff

\newsavebox{\form@box}     % will be set with \global
\newlength{\form@total@height}

\newenvironment{questionpicture}{%
  % 'form autoscale autoid' should turned on for every picture framed by the 'images' environment
  \tikzset{every picture/.style=form autoscale autoid}%
  \begin{lrbox}{0}
}{%
  \end{lrbox}%
  \global\setbox\form@box=\box0
}

\AfterEndEnvironment{questionpicture}{%
  \par\noindent
  \setlength{\fboxsep}{0pt}%
  \begingroup
  \minipage{\dimexpr\linewidth-\mywidth-2\fboxrule-2\fboxsep}
  \begingroup
  \enumerate[label=(\Alph*), ref=\Alph*, align=left, itemsep=7pt]
}



%% questionpictureAlt is equivalent to questionpicture, without the enumerate environment. It is used for direct placement of an image.

\newenvironment{questionpictureAlt}{%
  \tikzset{every picture/.style=form autoscale autoid}%
  \begin{lrbox}{0}
}{%
  \end{lrbox}%
  \global\setbox\form@box=\box0
}

\AfterEndEnvironment{questionpictureAlt}{%
  \par\noindent
  \setlength{\fboxsep}{5pt}%
  \begingroup
  \minipage{\dimexpr\linewidth-\mywidth-2\fboxrule-2\fboxsep}
}

\let\form@start@question@picture\questionpicture
\newcommand*{\form@invalid@place@for@calling@questionpicture}{%
  \errmessage{The 'questionpicture' environment must be used at the start of a
    'images' environment}%
}
% Generate an error message unless \questionpicture is used where expected
\let\questionpicture\form@invalid@place@for@calling@questionpicture

\let\form@start@question@picture\questionpictureAlt
\newcommand*{\form@invalid@place@for@calling@questionpictureAlt}{%
  \errmessage{The 'questionpictureAlt' environment must be used at the start of a
    'images' environment}%
}
% Generate an error message unless \questionpictureAlt is used where expected
\let\questionpictureAlt\form@invalid@place@for@calling@questionpictureAlt


\newenvironment{images}[1][]{%
  \formsetup{#1}%
  \let\questionpicture\form@start@question@picture
  \ignorespaces
}{%
  \endenumerate
  \endgroup
  \endminipage
  \endgroup
  %
  \settototalheight{\form@total@height}{\usebox{\form@box}}%
  \pgfmathsetmacro{\form@x@ratio}{\the\mywidth / \wd\form@box}%
  \pgfmathsetmacro{\form@y@ratio}{\the\myheight / \form@total@height}%
  \pgfmathsetmacro{\form@scale}{min(\form@x@ratio,
                                         \form@y@ratio)}%
  %
    \begin{minipage}[c][\myheight][c]{\mywidth}
      \centering
      \form@ifautoscale@enabled{%
        \scalebox{\form@scale}{\usebox{\form@box}}%
      }{%
        \usebox{\form@box}%
      }%
    \end{minipage}%
  \ignorespacesafterend
}


%% imagesAlt is equivalent to images, without the enumeration environment. It is used for the direct placement of an image.
\newenvironment{imagesAlt}[1][]{%
  \formsetup{#1}%
  \let\questionpictureAlt\form@start@question@picture
  \ignorespaces
}{%
  \endminipage
  \endgroup
  %
  \settototalheight{\form@total@height}{\usebox{\form@box}}%
  \pgfmathsetmacro{\form@x@ratio}{\the\mywidth / \wd\form@box}%
  \pgfmathsetmacro{\form@y@ratio}{\the\myheight / \form@total@height}%
  \pgfmathsetmacro{\form@scale}{min(\form@x@ratio,
                                         \form@y@ratio)}%
  %
  \setlength{\fboxrule}{0pt}
  \fcolorbox{red!20}{blue!20}{%
    \begin{minipage}[c][\myheight][c]{\mywidth}
      \centering
      \form@ifautoscale@enabled{%
        \scalebox{\form@scale}{\usebox{\form@box}}%
      }{%
        \usebox{\form@box}%
      }%
    \end{minipage}%
  }%
  \setlength{\fboxrule}{3pt}
  \ignorespacesafterend
}

% Autoscaling technique that doesn't affect font sizes in TikZ pictures.
% (based on <https://tex.stackexchange.com/a/497749/73317>)
%
% #1: unique per-picture id allowing several pictures to use this mechanism
%     in a given document (it should contain no control sequence token nor
%     active character)
% #2: width of the reference rectangle
% #3: height of the reference rectangle
\newcommand*\form@ExportBB[3]{%
 \path let
   \p1=($(current bounding box.north east)-(current bounding box.south west)$),
   \n1={#2/\x1},\n2={#3/\y1}
 in \pgfextra{\pgfmathsetmacro{\form@figscale}{min(\n1,\n2)}%
              \expandafter\xdef\csname form@auto@figscale@#1\endcsname{%
                \form@figscale}};
 \immediate\write\@mainaux{%
   \string\expandafter
   \gdef\string\csname\space form@auto@figscale@#1\string\endcsname{%
     \csname form@auto@figscale@#1\endcsname}}}

\tikzset{scale to max size/.style args={id #1 width #2height #3}{%
    execute at end picture={\form@ExportBB{#1}{#2}{#3}},
    /utils/exec={\form@check@unique@id{#1}%
                 \ifcsname form@auto@figscale@#1\endcsname
                   \wlog{Found autoscale value for picture '#1'}%
                 \else
                   \typeout{Automatically-scaled pictures: please recompile
                            for picture '#1'.}
                   \expandafter\gdef
                     \csname form@auto@figscale@#1\endcsname{1}
                 \fi},
   scale=\csname form@auto@figscale@#1\endcsname},
         form autoscale/.style={%
           scale to max size=id #1 width \mywidth height \myheight},
         % Same style except the id is automatically generated using a counter
         form autoscale autoid/.style={%
           /utils/exec={\form@form@autscale@autoid}}}
% End of the code based on <https://tex.stackexchange.com/a/497749/73317>

\makeatother




\usepackage[most]{tcolorbox}

\newtcbox{\textbox}[1][]{
    on line,
    box align = center,
    enhanced,
    colback = gray!20,
    colframe = black,
    coltitle = black,
    boxed title style = {size = small, colback = gray!40},
    attach boxed title to top center = {yshift = -\tcboxedtitleheight/2},
    tcbox width = auto limited,
    #1,
    before = \vspace{\baselineskip} \center,
    after = \endcenter \vspace{\baselineskip}
}





\begin{document}

This Tikzpicture clearly doesn't start all the way to the left
\begin{imagesAlt}
    \begin{questionpictureAlt}
      \begin{tikzpicture}
        \draw[thick] (10,10)--(20,15);
        \draw[thick] (10,10)--(15,0);
        \draw[thick] (10,10)--(0,15);
        \draw[thick] (10,10)--(5,0);
        \draw[thick] (10,10)--(20,5);
        \draw[thick] (10,10)--(5,20);
        \draw (10.5,12) node {$1$};
        \draw (7.5,12.5) node {$2$};
        \draw (8,9.5) node {$3$};
        \draw (10,7.5) node {$4$};
        \draw (12.5,7.5) node {$5$};
        \draw (12.5,10) node {$6$};
      \end{tikzpicture}
    \end{questionpictureAlt}
  \end{imagesAlt}

Even after adding the \emph{center} environment, the picture is still not quite centered on the page
\begin{center}
  \begin{imagesAlt}
    \begin{questionpictureAlt}
      \begin{tikzpicture}
        \draw[thick] (10,10)--(20,15);
        \draw[thick] (10,10)--(15,0);
        \draw[thick] (10,10)--(0,15);
        \draw[thick] (10,10)--(5,0);
        \draw[thick] (10,10)--(20,5);
        \draw[thick] (10,10)--(5,20);
        \draw (10.5,12) node {$1$};
        \draw (7.5,12.5) node {$2$};
        \draw (8,9.5) node {$3$};
        \draw (10,7.5) node {$4$};
        \draw (12.5,7.5) node {$5$};
        \draw (12.5,10) node {$6$};
      \end{tikzpicture}
    \end{questionpictureAlt}
  \end{imagesAlt}
\end{center}

When placed inside a \emph{tcolorbox}, the picture is not centered within it, but the \emph{tcolorbox} is centered on the page.
\textbox{
  \begin{imagesAlt}
    \begin{questionpictureAlt}
      \begin{tikzpicture}
        \draw[thick] (10,10)--(20,15);
        \draw[thick] (10,10)--(15,0);
        \draw[thick] (10,10)--(0,15);
        \draw[thick] (10,10)--(5,0);
        \draw[thick] (10,10)--(20,5);
        \draw[thick] (10,10)--(5,20);
        \draw (10.5,12) node {$1$};
        \draw (7.5,12.5) node {$2$};
        \draw (8,9.5) node {$3$};
        \draw (10,7.5) node {$4$};
        \draw (12.5,7.5) node {$5$};
        \draw (12.5,10) node {$6$};
      \end{tikzpicture}
    \end{questionpictureAlt}
  \end{imagesAlt}
  }


\end{document}

Insbesondere zeigen die violetten Linien, dass das Bild nicht innerhalb des zentriert ist tcolorbox, sondern das tcolorboxselbst zentriert ist (grüne Linien).

Danke!

Antwort1

Bitte beachten Sie die Stellen, die ich <---im untenstehenden Code mit markiert habe. Sie haben ein paar falsche Leerzeichen eingefügt, gesetzt \fboxruleauf0pt naches wurde für eine Berechnung mit einem anderen Wert verwendet (Berechnung in \AfterEndEnvironment{questionpictureAlt}{...}). Ich bin mit der Namensänderung von „Paket“ in nur nicht einverstanden form, da die Wahrscheinlichkeit sehr hoch ist, dass es jetzt oder in Zukunft zu Kollisionen mit einem anderen Paket kommt (im von mir bereitgestellten Code habe ich das „Paket“ ryanjformgenau so genannt, um Sie vor solchen Kollisionen zu schützen). Außerdem wurde eines der von \letIhnen erstellten Pakete zerstört \form@start@question@picture... weshalb Sie das Durcheinander \let\questionpictureAlt\form@start@question@picture(beachten Sie das fehlende Alt) in machen mussten \newenvironment{imagesAlt}{...}{...}.

Ein weiterer Punkt ist, dass ich die Verwendung imagesAltmit einem leeren sehr unnatürlich finde minipage, da dies die einzige Situation ist, in der dieses minipagenicht die in seinem Argument angegebene Breite einnimmt. Die minipageBreite in meiner choicesUmgebung wurde so berechnet, dass minipageplus das Bild in - \fcolorboxgenau einnimmt \linewidth. Die Verwendung von diesem mit einem leeren minipage, das einen Sonderfall auslöst, der seine Breite zerstört, widerspricht also der erwarteten Verwendung der choicesUmgebung, auf der imagesAltbasiert. Wenn Sie kein möchten minipage, warum führen Sie dann die Breitenberechnungen durch? Sie erfüllen keinen Zweck, wenn kein vorhanden ist minipage. Entfernen Sie in einem solchen Fall einfach das minipageaus der Umgebungsdefinition, die ungenutzten Breitenberechnungen, setzen Sie das ein \fcolorboxund fertig.

Ebenso imagesAltnimmt since konzeptgemäß eine volle Zeilenbreite ein, sobald Sie ein druckbares Zeichen zwischen \end{questionpictureAlt}und dem folgenden einfügen \end{imagesAlt}, und umschließt es imagesAltinnerhalb einer centerUmgebung, um dasBilddas normalerweise bündig mit dem rechten Rand abschließen sollte, ist eine sehr seltsame Technik. Wenn Sie imagesAltnur das enthalten würden \fcolorbox, wäre das meiner bescheidenen Meinung nach viel natürlicher.

Entschuldigen Sie, wenn ich negativ klinge, aber das alles noch einmal zu lesen hat lange gedauert, es ist schon spät und diese seltsamen Verwendungsweisen des aus meiner choicesUmgebung abgeleiteten Codes haben mich sozusagen verärgert (mir fehlen die richtigen Worte für Englisch – Sie haben mich „umgebracht“! :-) Der folgende Code behebt die im ersten Absatz dieser Antwort sowie in Ihrer documentUmgebung genannten Probleme (am linken Rand beginnen, zentrieren usw.):

\documentclass{article}
\usepackage{graphicx}
\usepackage{calc} % for \settototalheight (used for convenience)
\usepackage{xcolor}
\usepackage{etoolbox}
\usepackage{xparse}
\usepackage{tikz}
\usepackage{parskip}
\usepackage{enumitem}
\usetikzlibrary{calc}

% Frame dimensions
\newlength{\mywidth}
\newlength{\myheight}
\setlength{\mywidth}{3.5cm}
\setlength{\myheight}{3.5cm}

\makeatletter

% l3keys supports a key/value-style interface for the optional argument of the 'images' environment.
\ExplSyntaxOn

\msg_new:nnn { form } { duplicate-figure-id }
  { duplicate~figure~identifier:~'\exp_not:n {#1}'. }

% Whether to perform the \scalebox-based autoscaling for a given figure
\bool_new:N \l__form_do_autoscale_pic_in_images_bool
% Sequence recording all figure identifiers (for the 'scale to max size' TikZ style) found so far
\seq_new:N \g__form_scale_to_max_style_figure_ids_seq
% Counter used when generating automatic figure identifiers for 'form autoscale'
\int_new:N \g_form_last_autogenerated_figure_nb_int

% Define the options supported in the optional argument of the 'images' environment
\keys_define:nn { form }
  {
    autoscale .bool_set:N = \l__form_do_autoscale_pic_in_images_bool,
    % Value used when the 'autoscale' key is passed with no value
    autoscale .default:n = { true },
    autoscale .initial:n = { false }
  }

\cs_new_protected:Npn \__form_set_keys:n #1
  { \keys_set:nn { form } {#1} }

\cs_new_protected:Npn \__form_check_unique_id:n #1
  {
    \seq_if_in:NnTF \g__form_scale_to_max_style_figure_ids_seq {#1}
      { \msg_error:nnn { form } { duplicate-figure-id } {#1} }
      { \seq_gput_right:Nn \g__form_scale_to_max_style_figure_ids_seq {#1} }
  }

\cs_new_protected:Npn \__form_form_autoscale:n #1
  {
    \pgfkeys { /tikz/.cd, form~autoscale={#1} }
  }

\cs_generate_variant:Nn \__form_form_autoscale:n { V }

% Automatic construction of generated ids (the pattern is defined here)
\cs_new:Npn \__form_autogenerated_id:n #1
  { form~autogenerated~id~#1 }

\cs_generate_variant:Nn \__form_autogenerated_id:n { V }

\cs_new_protected:Npn \__form_form_autoscale_autoid:
  {
    % Increment the counter
    \int_gincr:N \g_form_last_autogenerated_figure_nb_int
    \tl_set:Nx \l_tmpa_tl       % generate an ID based on the counter value
      {
        \__form_autogenerated_id:V
          \g_form_last_autogenerated_figure_nb_int
      }
    % Call the 'form autoscale' style with the new ID
    \__form_form_autoscale:V \l_tmpa_tl
  }

% Set up aliases using LaTeX2e naming style
\cs_set_eq:NN \formsetup \__form_set_keys:n
\cs_set_eq:NN \form@check@unique@id \__form_check_unique_id:n
\cs_set_eq:NN \form@form@autoscale@autoid \__form_form_autoscale_autoid:

% If-then-else command using the boolean
% \l__form_do_autoscale_pic_in_images_bool to choose the branch
\NewDocumentCommand \form@ifautoscale@enabled { }
  {
    \bool_if:NTF \l__form_do_autoscale_pic_in_images_bool
  }

\ExplSyntaxOff

\newsavebox{\form@box}     % will be set with \global
\newlength{\form@total@height}

\newenvironment{questionpicture}{%
  % 'form autoscale autoid' should be turned on for every picture framed by
  % the 'images' environment
  \tikzset{every picture/.style=form autoscale autoid}%
  \begin{lrbox}{0}
}{%
  \end{lrbox}%
  \global\setbox\form@box=\box0
}

\AfterEndEnvironment{questionpicture}{%
  \par\noindent
  \setlength{\fboxsep}{0pt}%
  \begingroup
  \minipage{\dimexpr\linewidth-\mywidth-2\fboxrule-2\fboxsep}
  \begingroup
  \enumerate[label=(\Alph*), ref=\Alph*, align=left, itemsep=7pt]
}



%% questionpictureAlt is equivalent to questionpicture, without the enumerate environment. It is used for direct placement of an image.

\newenvironment{questionpictureAlt}{%
  \tikzset{every picture/.style=form autoscale autoid}%
  \begin{lrbox}{0}
}{%
  \end{lrbox}%
  \global\setbox\form@box=\box0
}

\AfterEndEnvironment{questionpictureAlt}{%
  \par\noindent
  \setlength{\fboxsep}{5pt}%
  \setlength{\fboxrule}{0pt}% <--- moved here and added % to remove space
  \begingroup
  \minipage{\dimexpr\linewidth-\mywidth-2\fboxrule-2\fboxsep}
}

\let\form@start@question@picture\questionpicture
\newcommand*{\form@invalid@place@for@calling@questionpicture}{%
  \errmessage{The 'questionpicture' environment must be used at the start of a
    'images' environment}%
}
% Generate an error message unless \questionpicture is used where expected
\let\questionpicture\form@invalid@place@for@calling@questionpicture

\let\form@start@question@pictureAlt\questionpictureAlt % <--- added Alt
\newcommand*{\form@invalid@place@for@calling@questionpictureAlt}{%
  \errmessage{The 'questionpictureAlt' environment must be used at the start of a
    'images' environment}%
}
% Generate an error message unless \questionpictureAlt is used where expected
\let\questionpictureAlt\form@invalid@place@for@calling@questionpictureAlt


\newenvironment{images}[1][]{%
  \formsetup{#1}%
  \let\questionpicture\form@start@question@picture
  \ignorespaces
}{%
  \endenumerate
  \endgroup
  \endminipage
  \endgroup
  %
  \settototalheight{\form@total@height}{\usebox{\form@box}}%
  \pgfmathsetmacro{\form@x@ratio}{\the\mywidth / \wd\form@box}%
  \pgfmathsetmacro{\form@y@ratio}{\the\myheight / \form@total@height}%
  \pgfmathsetmacro{\form@scale}{min(\form@x@ratio, \form@y@ratio)}%
  % <--- You suppressed the \fcolorbox here! Less space is occupied.
    \begin{minipage}[c][\myheight][c]{\mywidth}
      \centering
      \form@ifautoscale@enabled{%
        \scalebox{\form@scale}{\usebox{\form@box}}%
      }{%
        \usebox{\form@box}%
      }%
    \end{minipage}%
  \ignorespacesafterend
}


%% imagesAlt is equivalent to images, without the enumeration environment. It is used for the direct placement of an image.
\newenvironment{imagesAlt}[1][]{%
  \formsetup{#1}%
  \let\questionpictureAlt\form@start@question@pictureAlt % <--- added Alt
  \ignorespaces
}{%
  \endminipage
  \endgroup
  %
  \settototalheight{\form@total@height}{\usebox{\form@box}}%
  \pgfmathsetmacro{\form@x@ratio}{\the\mywidth / \wd\form@box}%
  \pgfmathsetmacro{\form@y@ratio}{\the\myheight / \form@total@height}%
  \pgfmathsetmacro{\form@scale}{min(\form@x@ratio, \form@y@ratio)}%
  %
  \fcolorbox{red!20}{blue!20}{%
    \begin{minipage}[c][\myheight][c]{\mywidth}
      \centering
      \form@ifautoscale@enabled{%
        \scalebox{\form@scale}{\usebox{\form@box}}%
      }{%
        \usebox{\form@box}%
      }%
    \end{minipage}%
  }%
  %\setlength{\fboxrule}{3pt}% <--- What was the purpose of this here?
  \ignorespacesafterend
}

% Autoscaling technique that doesn't affect font sizes in TikZ pictures.
% (based on <https://tex.stackexchange.com/a/497749/73317>)
%
% #1: unique per-picture id allowing several pictures to use this mechanism
%     in a given document (it should contain no control sequence token nor
%     active character)
% #2: width of the reference rectangle
% #3: height of the reference rectangle
\newcommand*\form@ExportBB[3]{%
 \path let
   \p1=($(current bounding box.north east)-(current bounding box.south west)$),
   \n1={#2/\x1},\n2={#3/\y1}
 in \pgfextra{\pgfmathsetmacro{\form@figscale}{min(\n1,\n2)}%
              \expandafter\xdef\csname form@auto@figscale@#1\endcsname{%
                \form@figscale}};
 \immediate\write\@mainaux{%
   \string\expandafter
   \gdef\string\csname\space form@auto@figscale@#1\string\endcsname{%
     \csname form@auto@figscale@#1\endcsname}}}

\tikzset{scale to max size/.style args={id #1 width #2height #3}{%
    execute at end picture={\form@ExportBB{#1}{#2}{#3}},
    /utils/exec={\form@check@unique@id{#1}%
                 \ifcsname form@auto@figscale@#1\endcsname
                   \wlog{Found autoscale value for picture '#1'}%
                 \else
                   \typeout{Automatically-scaled pictures: please recompile
                            for picture '#1'.}
                   \expandafter\gdef
                     \csname form@auto@figscale@#1\endcsname{1}
                 \fi},
   scale=\csname form@auto@figscale@#1\endcsname},
         form autoscale/.style={%
           scale to max size=id #1 width \mywidth height \myheight},
         % Same style except the id is automatically generated using a counter
         form autoscale autoid/.style={%
           /utils/exec={\form@form@autoscale@autoid}}}
% End of the code based on <https://tex.stackexchange.com/a/497749/73317>

\makeatother




\usepackage[most]{tcolorbox}

\newtcbox{\textbox}[1][]{
    on line,
    box align = center,
    enhanced,
    colback = gray!20,
    colframe = black,
    coltitle = black,
    boxed title style = {size = small, colback = gray!40},
    attach boxed title to top center = {yshift = -\tcboxedtitleheight/2},
    tcbox width = auto limited,
    #1,
    before = \vspace{\baselineskip}\center,
    after = \endcenter \vspace{\baselineskip}
}

\begin{document}

This Tikzpicture clearly starts all the way to the left:
\begin{imagesAlt}
    \begin{questionpictureAlt}
      \begin{tikzpicture}
        \draw[thick] (10,10)--(20,15);
        \draw[thick] (10,10)--(15,0);
        \draw[thick] (10,10)--(0,15);
        \draw[thick] (10,10)--(5,0);
        \draw[thick] (10,10)--(20,5);
        \draw[thick] (10,10)--(5,20);
        \draw (10.5,12) node {$1$};
        \draw (7.5,12.5) node {$2$};
        \draw (8,9.5) node {$3$};
        \draw (10,7.5) node {$4$};
        \draw (12.5,7.5) node {$5$};
        \draw (12.5,10) node {$6$};
      \end{tikzpicture}
    \end{questionpictureAlt}
  \end{imagesAlt}

After adding the \emph{center} environment, the picture is perfectly centered
on the page:\\*
\rule{\dimexpr 0.5\linewidth-0.5\mywidth-5pt\relax}{0.4pt}\hfill
\rule{\dimexpr 0.5\linewidth-0.5\mywidth-5pt\relax}{0.4pt}\vspace{-1.6ex}%
\begin{center} % <--- It doesn't make sense to use imagesAlt inside center
  \begin{imagesAlt}
    \begin{questionpictureAlt}
      \begin{tikzpicture}
        \draw[thick] (10,10)--(20,15);
        \draw[thick] (10,10)--(15,0);
        \draw[thick] (10,10)--(0,15);
        \draw[thick] (10,10)--(5,0);
        \draw[thick] (10,10)--(20,5);
        \draw[thick] (10,10)--(5,20);
        \draw (10.5,12) node {$1$};
        \draw (7.5,12.5) node {$2$};
        \draw (8,9.5) node {$3$};
        \draw (10,7.5) node {$4$};
        \draw (12.5,7.5) node {$5$};
        \draw (12.5,10) node {$6$};
      \end{tikzpicture}
    \end{questionpictureAlt}
  \end{imagesAlt}
\end{center}

When placed inside a \emph{tcolorbox}, the picture is centered within it, and
the \emph{tcolorbox} is centered on the page.
\textbox{%
  \begin{imagesAlt}
    \begin{questionpictureAlt}
      \begin{tikzpicture}
        \draw[thick] (10,10)--(20,15);
        \draw[thick] (10,10)--(15,0);
        \draw[thick] (10,10)--(0,15);
        \draw[thick] (10,10)--(5,0);
        \draw[thick] (10,10)--(20,5);
        \draw[thick] (10,10)--(5,20);
        \draw (10.5,12) node {$1$};
        \draw (7.5,12.5) node {$2$};
        \draw (8,9.5) node {$3$};
        \draw (10,7.5) node {$4$};
        \draw (12.5,7.5) node {$5$};
        \draw (12.5,10) node {$6$};
      \end{tikzpicture}
    \end{questionpictureAlt}
  \end{imagesAlt}%
}

\end{document}

Bildschirmfoto

verwandte Informationen