
Das MWE fügt Leerzeichen proportional zum Maximalwert der \foreach
Iteration hinzu:
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
\dtlexpandnewvalue
erforderlich 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@updatekeys
definiert \@defl@dogetprops
über ein \edef
und 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@updatekeys
ziemlich groß ist, löst die Ausgabe \unskip
nach dem Hinzufügen eines Mitglieds (entweder eines Teils von \AddMemberToDB
oder innerhalb von \foreach
) das Problem.
\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}