检查是否定义了多个列类型失败

检查是否定义了多个列类型失败

使用讨论的命令如何检查某个列类型是否已定义?如何实现检查已加载包的命令?

我已经建立了一个环境来检查是否定义了多个列

\documentclass{scrbook}

\usepackage{etoolbox}
\usepackage{ragged2e}
\usepackage{array}

\makeatletter
\newcommand\CheckIfColumntypeDefined[1]{%
  \providebool{tpl@coltype@#1}
  \ifcsdef{NC@find@\string#1}%
    {\setbool{tpl@coltype@#1}{true}}%
    {\ifcsdef{columntype@\string#1}
      {\setbool{tpl@coltype@#1}{true}}%
      {\setbool{tpl@coltype@#1}{false}}%
    }%
}

\newcommand\IfColumntypeDefined[3]{%
  \CheckIfColumntypeDefined{#1}
  \ifboolexpr{ bool{tpl@coltype@#1} }{#2}{#3}%
}

\newcommand{\IfColumntypesDefined}[1]{%
  \@tempswatrue
  \def\do##1{%
    % define \@tempa with trimmed index element.
    \edef\@tempa{\zap@space##1 \@empty}%
    % check if package of current index is loaded
    \IfColumntypeDefined{\@tempa}{}{\@tempswafalse}%
  }%
  % Process csv list with command \do (etoolbox)
  \docsvlist{#1}%
  % ??
  \if@tempswa\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi%
}
\makeatother

\begin{document}

\newcolumntype{L}[1]{>{\RaggedRight\arraybackslash\hspace{0pt}}p{#1}}
\newcolumntype{C}[1]{>{\Centering\arraybackslash\hspace{0pt}}p{#1}}

\IfColumntypeDefined{L}{L is defined}{L is not defined}
\IfColumntypeDefined{C}{C is defined}{C is not defined}

\IfColumntypesDefined{L,C}
{L and C columns are defined}
{L and C columns are not defined}

\end{document}

但是它总是返回 false,我不明白,也不知道如何调试。所以输出是

L 已定义 C 已定义

L 和 C 列未定义

答案1

我认为用列类型列表进行定义没有任何意义\IfColumntypesDefined;然而问题在于

\IfColumntypeDefined{\@tempa}{}{\@tempswafalse}

线。使用

\expandafter\IfColumntypeDefined\expandafter{\@tempa}{}{\@tempswafalse}

你得到了正确的结果。原因是\string#1使用了\CheckIfColumntypeDefined(这是一件好事,因为它可以防止错误输入)。

相关内容