使用讨论的命令如何检查某个列类型是否已定义?和如何实现检查已加载包的命令?
我已经建立了一个环境来检查是否定义了多个列
\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
(这是一件好事,因为它可以防止错误输入)。