\foreach 内でデータベースにメンバーを追加するときに不要な空白スペースが発生する

\foreach 内でデータベースにメンバーを追加するときに不要な空白スペースが発生する

MWE は\foreach反復の最大値に比例して空白スペースを追加します。

ここに画像の説明を入力してください

これはなぜでしょうか、またこの余分なスペースをなくすにはどうすればよいのでしょうか?

注記:

  • この問題は、以前私が経験した問題と似ているようです。出力されるべきでないテキストが出力されるしかし、この問題を解決する方法がわかりません。
  • \dtlexpandnewvalueこれは、データベースから正しい出力を得るために必要な、何らかの拡張関連の問題であると推測しています。

コード:

\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}

答え1

マクロはを介し​​て\@dtl@updatekeys定義し、行末に挿入しないため、不要なスキップが発生します。\@defl@dogetprops\edef%

\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
    %...
}

\@dtl@updatekeysは非常に大きいため、\unskipメンバー ( の一部\AddMemberToDBまたは 内のいずれか\foreach) を追加した後に を発行すると、問題は解決します。

ここに画像の説明を入力してください

\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}

関連情報