Unerwünschtes Leerzeichen beim Hinzufügen eines Mitglieds zu einer Datenbank innerhalb von \foreach

Unerwünschtes Leerzeichen beim Hinzufügen eines Mitglieds zu einer Datenbank innerhalb von \foreach

Das MWE fügt Leerzeichen proportional zum Maximalwert der \foreachIteration hinzu:

Bildbeschreibung hier eingeben

Warum ist das so und wie entferne ich diesen zusätzlichen Platz?

Notiz:

  • Dieses Problem ähnelt einem früheren Problem, das ich früher hatte inEs wird Text ausgegeben, obwohl keiner ausgegeben werden sollte., aber ich weiß nicht, wie ich dieses Problem lösen kann.
  • Ich vermute, dass es sich hier um ein mit der Erweiterung zusammenhängendes Problem handelt, das \dtlexpandnewvalueerforderlich ist, um die richtige Ausgabe aus der Datenbank zu erhalten.

Code:

\documentclass{article}

\usepackage{pgffor}
\usepackage{datatool}
\usepackage{showframe}

\newcommand*{\InitalizeDB}[1]{% 
    \DTLifdbexists{#1}%
        {\DTLcleardb{#1}}% DB exists, so just clear it
        {\DTLnewdb{#1}}%   DB does not exist, so create it
}%
\newcommand*{\AddMemberToDB}[3]{%
    % #1 = name of DB
    % #2 = db key to be used
    % #3 = member to be added to DB
    \dtlexpandnewvalue%
    \DTLnewrow{#1}%
    \DTLnewdbentry{#1}{#2}{#3}%
}%



\begin{document}
\InitalizeDB{MyDB}
\noindent
abc%
\foreach \x in {2,...,7} {%
    \AddMemberToDB{MyDB}{MyDBKey}{\x}%
}%
def

\bigskip\noindent
Database:\par
\DTLdisplaydb{MyDB}
\end{document}

Antwort1

Das Makro \@dtl@updatekeysdefiniert \@defl@dogetpropsüber ein \edefund fügt nicht %am Ende der Zeile ein, was zu dem unerwünschten Überspringen führt:

\newcommand*{\@dtl@updatekeys}[3]{%
  \@sDTLifhaskey{#1}{#2}%
  {%
    \expandafter\dtlcolumnnum\expandafter
      =\dtlcolumnindex{#1}{#2}\relax
    \edef\@dtl@dogetprops{\noexpand\@dtl@getprops
      {\noexpand\@dtl@key}{\noexpand\@dtl@type}%
      {\noexpand\@dtl@colhead}{\noexpand\@dtl@before}%
      {\noexpand\@dtl@after}{\the\csname dtlkeys@#1\endcsname}%
      {\number\dtlcolumnnum}}% <--------- inserted '%'
    \@dtl@dogetprops
    %...
}

Da \@dtl@updatekeysziemlich groß ist, löst die Ausgabe \unskipnach dem Hinzufügen eines Mitglieds (entweder eines Teils von \AddMemberToDBoder innerhalb von \foreach) das Problem.

Bildbeschreibung hier eingeben

\documentclass{article}

\usepackage{pgffor}% http://ctan.org/pkg/pgf
\usepackage{datatool}% http://ctan.org/pkg/datatool
\usepackage{showframe}% http://ctan.org/pkg/showframe

\newcommand*{\InitalizeDB}[1]{% 
    \DTLifdbexists{#1}%
        {\DTLcleardb{#1}}% DB exists, so just clear it
        {\DTLnewdb{#1}}%   DB does not exist, so create it
}%
\newcommand*{\AddMemberToDB}[3]{%
    % #1 = name of DB
    % #2 = db key to be used
    % #3 = member to be added to DB
    \dtlexpandnewvalue%
    \DTLnewrow{#1}%
    \DTLnewdbentry{#1}{#2}{#3}%
}%

\begin{document}
\InitalizeDB{MyDB}
\noindent
abc%
\foreach \x in {2,...,7} {%
    \AddMemberToDB{MyDB}{MyDBKey}{\x}\unskip%
}%
def

\bigskip\noindent
Database:\par
\DTLdisplaydb{MyDB}
\end{document}

verwandte Informationen