如何避免 tcbraster 中的额外空间?

如何避免 tcbraster 中的额外空间?

我尝试生成一些会议代码。因此,我想列出参与者及其机构的名称,并按机构的字母顺序将其打印出来。为了实现这一点,我想使用 中的 tcbraster tcolorbox。我必须使用 遍历我的列表,\@for并用内容填充tcolorboxes。这很好用。但在 tcbraster 中,第一行开头有少量空间,因此我得到的 comln 比要求的少。如果我将 的宽度减小tcbraster到 97%,\textwidth它就可以正常工作。如果我手动执行 tcbraster,它也可以正常工作。我怎样才能避免让生活变得如此艰难和输出不那么好的小额外空间。

这是一个最小的例子和生成的输出:

\documentclass[a4paper]{scrartcl}

\usepackage[raster]{tcolorbox}
\usepackage{lstdoc}
\usepackage{trimspaces}
\usepackage{xstring}

\usepackage[ngerman]{babel}
\usepackage[latin1]{inputenc}

\makeatletter

\let\Institutionen\@empty

% Definition der Umgebungen
\newenvironment{Einladung}{\Einladungskopfsetzen}{}

\newcommand*{\ifundefined}[1]{%
  \begingroup\expandafter\expandafter\expandafter\endgroup
  \expandafter\ifx\csname #1\endcsname\relax
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
}

%Listprocessing
\def\addtolist#1#2{%
    \expandafter\lst@lAddTo\csname #1\endcsname{#2,}
    \expandafter\lst@BubbleSort\csname #1\endcsname
}

\renewcommand{\ifinlist}[3]{\@for\next:=#1\do{\ifthenelse{\equal\next{\trim@spaces{#2}}}{#3}{\relax}}}

%\IfSubStr[*][number]{string}{stringA}{true}{false}
% Teilnehmerbefehle definieren
\def\teilnBearbeiten#1#2#3#4{
    \IfSubStr{\Institutionen}{#3} %%% Pr�fen, ob Institution in Liste bereits enthalten ist
        {   %%% Institution in Liste enthalten, tue nichts
        } 
        {   %%% Institution in Liste nicht enthalten, also in Liste aufnehmen
            \addtolist{Institutionen}{#3} 
            \expandafter\let\csname #3\endcsname\@empty
        }
    \addtolist{#3}{#1#2#3}
    \expandafter\gdef\csname #1#2#3\endcsname{\csname #4\endcsname{\trim@spaces{#1}, \trim@spaces{#2}}}
}

\def\teiln#1,#2,#3;{
\teilnBearbeiten{#1}{#2}{#3}{relax} % anstelle des relax kann ein Formatbefehl stehen z.B. 'uwave' aus 'ulem'
}

\newcommand{\Einladungskopfsetzen}{
    \begin{tcbraster}[raster columns=3, raster equal height, size=small, colframe=red!50!black, colback=white!10!white, colbacktitle=black!40!white, toprule=0pt, bottomrule=0pt, leftrule=0pt, rightrule=0pt, titlerule=0pt, arc=0pt]
    \@for\nextInstitution:=\Institutionen\do{
        \ifx\empty\nextInstitution\empty
        \else
            \begin{tcolorbox}[title=\nextInstitution]
            \edef\tempListe{\csname\nextInstitution\endcsname}
            \@for\nextEintrag:=\tempListe\do{
                \ifx \empty\nextEintrag\empty  
                \else
                  \csname\nextEintrag\endcsname\\
                \fi
            }
            \end{tcolorbox}
        \fi
    }
    \end{tcbraster}
}

\newcommand{\EinladungskopfsetzenOHNE}{
    \begin{tcbraster}[raster width=0.97\textwidth, raster columns=3, raster equal height, size=small, colframe=red!50!black, colback=white!10!white, colbacktitle=black!40!white, toprule=0pt, bottomrule=0pt, leftrule=0pt, rightrule=0pt, titlerule=0pt, arc=0pt]
    \@for\nextInstitution:=\Institutionen\do{
        \ifx\empty\nextInstitution\empty
        \else
            \begin{tcolorbox}[title=\nextInstitution]
            \edef\tempListe{\csname\nextInstitution\endcsname}
            \@for\nextEintrag:=\tempListe\do{
                \ifx \empty\nextEintrag\empty  
                \else
                  \csname\nextEintrag\endcsname\\
                \fi
            }
            \end{tcolorbox}
        \fi
    }
    \end{tcbraster}
}

\begin{document}
    \teiln Name1,Vorname1,Institution1; 
    \teiln Name2,Vorname2,Institution1;
    \teiln Name3,Vorname3,Institution3;
    \teiln Name4,Vorname4,Institution4;
    \teiln Name5,Vorname5,Institution5;

 \section{tcbraster ohne  `raster width=0.97\textbackslash textwidth'}
    \begin{Einladung}
        Agenda
    \end{Einladung}

\section{tcbraster mit  `raster width=0.97\textbackslash textwidth'}

\EinladungskopfsetzenOHNE

\section{tcbraster ohne Schleifen}
\begin{tcbraster}[raster columns=3, raster equal height, size=small, colframe=red!50!black, colback=white!10!white, colbacktitle=black!40!white, toprule=0pt, bottomrule=0pt, leftrule=0pt, rightrule=0pt, titlerule=0pt, arc=0pt]
\begin{tcolorbox}[title=TITEL]
              Box Text
            \end{tcolorbox}
            \begin{tcolorbox}[title=TITEL]
              Box Text
            \end{tcolorbox}
            \begin{tcolorbox}[title=TITEL]
              Box Text
            \end{tcolorbox}
            \begin{tcolorbox}[title=TITEL]
              Box Text
            \end{tcolorbox}
            \begin{tcolorbox}[title=TITEL]
              Box Text
            \end{tcolorbox}
    \end{tcbraster}

\end{document}

以下是生成的输出: 在此处输入图片描述

答案1

-- 部分缺少多个%字符\do{,导致出现空白(和水平偏移),如果剩余空间不足,则会导致换行到下一行tcolorbox

\documentclass[a4paper]{scrartcl}

\usepackage[raster]{tcolorbox}
\usepackage{lstdoc}
\usepackage{trimspaces}
\usepackage{xstring}

\usepackage[ngerman]{babel}
\usepackage[latin1]{inputenc}

\makeatletter

\let\Institutionen\@empty

% Definition der Umgebungen
\newenvironment{Einladung}{\Einladungskopfsetzen}{}

\newcommand*{\ifundefined}[1]{%
  \begingroup\expandafter\expandafter\expandafter\endgroup
  \expandafter\ifx\csname #1\endcsname\relax
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
}

%Listprocessing
\def\addtolist#1#2{%
    \expandafter\lst@lAddTo\csname #1\endcsname{#2,}
    \expandafter\lst@BubbleSort\csname #1\endcsname
}

\renewcommand{\ifinlist}[3]{\@for\next:=#1\do{\ifthenelse{\equal\next{\trim@spaces{#2}}}{#3}{\relax}}}

%\IfSubStr[*][number]{string}{stringA}{true}{false}
% Teilnehmerbefehle definieren
\def\teilnBearbeiten#1#2#3#4{
    \IfSubStr{\Institutionen}{#3} %%% Pr�fen, ob Institution in Liste bereits enthalten ist
        {   %%% Institution in Liste enthalten, tue nichts
        } 
        {   %%% Institution in Liste nicht enthalten, also in Liste aufnehmen
            \addtolist{Institutionen}{#3} 
            \expandafter\let\csname #3\endcsname\@empty
        }
    \addtolist{#3}{#1#2#3}
    \expandafter\gdef\csname #1#2#3\endcsname{\csname #4\endcsname{\trim@spaces{#1}, \trim@spaces{#2}}}
}

\def\teiln#1,#2,#3;{%
\teilnBearbeiten{#1}{#2}{#3}{relax} % anstelle des relax kann ein Formatbefehl stehen z.B. 'uwave' aus 'ulem'
}

\newcommand{\Einladungskopfsetzen}{%
    \begin{tcbraster}[raster columns=3, raster equal height, size=small, colframe=red!50!black, colback=white!10!white, colbacktitle=black!40!white, toprule=0pt, bottomrule=0pt, leftrule=0pt, rightrule=0pt, titlerule=0pt, arc=0pt]
    \@for\nextInstitution:=\Institutionen\do{%
        \ifx\empty\nextInstitution\empty
        \else
            \begin{tcolorbox}[title=\nextInstitution]
            \edef\tempListe{\csname\nextInstitution\endcsname}
            \@for\nextEintrag:=\tempListe\do{
                \ifx \empty\nextEintrag\empty  
                \else
                  \csname\nextEintrag\endcsname\\
                \fi
            }
            \end{tcolorbox}
        \fi
    }
    \end{tcbraster}
}

\newcommand{\EinladungskopfsetzenOHNE}{%
    \begin{tcbraster}[raster width=0.97\textwidth, raster columns=3, raster equal height, size=small, colframe=red!50!black, colback=white!10!white, colbacktitle=black!40!white, toprule=0pt, bottomrule=0pt, leftrule=0pt, rightrule=0pt, titlerule=0pt, arc=0pt]
    \@for\nextInstitution:=\Institutionen\do{%
        \ifx\empty\nextInstitution\empty
        \else
            \begin{tcolorbox}[title=\nextInstitution]
            \edef\tempListe{\csname\nextInstitution\endcsname}
            \@for\nextEintrag:=\tempListe\do{
                \ifx \empty\nextEintrag\empty  
                \else
                  \csname\nextEintrag\endcsname\\
                \fi
            }
            \end{tcolorbox}
        \fi
    }
    \end{tcbraster}
}

\begin{document}
    \teiln Name1,Vorname1,Institution1; 
    \teiln Name2,Vorname2,Institution1;
    \teiln Name3,Vorname3,Institution3;
    \teiln Name4,Vorname4,Institution4;
    \teiln Name5,Vorname5,Institution5;

 \section{tcbraster ohne  `raster width=0.97\textbackslash textwidth'}
    \begin{Einladung}
        Agenda
    \end{Einladung}

\section{tcbraster mit  `raster width=0.97\textbackslash textwidth'}

\EinladungskopfsetzenOHNE

\section{tcbraster ohne Schleifen}
\begin{tcbraster}[raster columns=3, raster equal height, size=small, colframe=red!50!black, colback=white!10!white, colbacktitle=black!40!white, toprule=0pt, bottomrule=0pt, leftrule=0pt, rightrule=0pt, titlerule=0pt, arc=0pt]
\begin{tcolorbox}[title=TITEL]
              Box Text
            \end{tcolorbox}
            \begin{tcolorbox}[title=TITEL]
              Box Text
            \end{tcolorbox}
            \begin{tcolorbox}[title=TITEL]
              Box Text
            \end{tcolorbox}
            \begin{tcolorbox}[title=TITEL]
              Box Text
            \end{tcolorbox}
            \begin{tcolorbox}[title=TITEL]
              Box Text
            \end{tcolorbox}
    \end{tcbraster}

\end{document}

在此处输入图片描述

相关内容