表格中的 ifmtarg 不起作用

表格中的 ifmtarg 不起作用

我尝试创建实验报告的自定义类,该类需要在标题页上有一个表格,其中包含我将报告交给助手进行更正的日期。为了让用户尽可能方便,我希望在使用类似 的命令定义日期和文本时自动显示它们\firsthandin{2017-01-06}。因为我需要定义\firsthandin,所以我的想法是检查这个宏是否定义是没有用的,当然是定义了;而是检查参数是否为空或与默认值不同。所以我尝试使用\ifmtargifmtarg.sty这是我目前所拥有的:

协议文件

\ProvidesClass{protokoll}[2017/01/05 v1.0]
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{scrartcl}}
\ProcessOptions
\LoadClass[a4paper,fontsize=11pt,oneside]{scrartcl}
%=====================================================
\RequirePackage[utf8]{inputenc}
\RequirePackage{ifmtarg}
%=====================================================
\newcommand{\@firsthandin}{}
\newcommand{\firsthandin}[1]{\renewcommand{\@firsthandin}{#1}}

\newcommand{\@secondhandin}{Unknown}
\newcommand{\secondhandin}[1]{\renewcommand{\@secondhandin}{#1}}

\renewcommand{\maketitle}{
\begin{titlepage}
\begin{table}
\centering
\begin{tabular}{ll}
\ifmtarg{\@firsthandin}{}{First date} & \ifmtarg{\@firsthandin{}{\@firsthandin} \\
Second date & \@secondhandin \\
\end{tabular}
\end{table}
\end{titlepage}
}

第二行只是为了检查变量是否还有另一个错误。我还尝试将表格的第一行更改为,\ifmtarg{\@firsthandin}{}{First date & \@firsthandin \\}但这会产生相同的错误。

mwe_协议.tex

\documentclass{protokoll}
\firsthandin{05.01.2017}
\begin{document}
\maketitle
\end{document}

我收到错误,Misplaced \cr根据@DavidCarlisle (乳胶错误中 Misplaced \cr 是什么意思) 用于 的定义\\,所以我猜想\ifmtarg这会弄乱表格的换行符。有什么想法可以解决这个问题吗?(给出的是空格还是“什么都没有”并不重要)

答案1

表格单元格中的条件语句比较棘手。应首先使用类似以下语句进行扩展:\edef\x{\if...}\x

我没有更改驱动程序文件protokoll.tex,因此请从 OP 加载

\ProvidesClass{protokoll}[2017/01/05 v1.0]
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{scrartcl}}
\ProcessOptions
\LoadClass[a4paper,fontsize=11pt,oneside]{scrartcl}
%=====================================================
\RequirePackage[utf8]{inputenc}
\RequirePackage{ifmtarg}
%=====================================================
\newcommand{\@firsthandin}{}
\newcommand{\firsthandin}[1]{\renewcommand{\@firsthandin}{#1}}

\newcommand{\@secondhandin}{Unknown}
\newcommand{\secondhandin}[1]{\renewcommand{\@secondhandin}{#1}}

\renewcommand{\maketitle}{
\begin{titlepage}
\begin{table}
\centering
\begin{tabular}{ll}
  \edef\x{\@ifmtarg{\@firsthandin}{}{First Date}}\x & \edef\x{\@ifmtarg{\@firsthandin}{}{\@firsthandin}}\x \\
  Second date & \@secondhandin \\
\end{tabular}
\end{table}
\end{titlepage}
}

在此处输入图片描述

答案2

这是一个使用的示例etoolbox,我还重命名了持有者宏,以便它们可以在该示例中的用户空间中使用。

请注意etoolbox包含一个\ifblank宏,但不能用于测试给定宏是否为空。

\documentclass[a4paper]{article}

\usepackage{etoolbox}
\newcommand{\firsthandinXX}{}
\newcommand{\firsthandin}[1]{\renewcommand{\firsthandinXX}{#1}}

\newcommand{\secondhandinXX}{Unknown}
\newcommand{\secondhandin}[1]{\renewcommand{\secondhandinXX}{#1}}

\renewcommand{\maketitle}{
\begin{titlepage}
\begin{table}
\centering
\begin{tabular}{ll}
\ifdefvoid{\firsthandinXX}{}{First date} & \ifdefvoid{\firsthandinXX}{}{\firsthandinXX} \\
Second date & \secondhandinXX \\
\end{tabular}
\end{table}
\end{titlepage}
}


\firsthandin{05.01.2017}

\begin{document}

\maketitle

\end{document}

答案3

您的代码中存在一些错误:检查差异。

protokoll.cls

\ProvidesClass{protokoll}[2017/01/05 v1.0]
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{scrartcl}}
\ProcessOptions
\LoadClass[a4paper,fontsize=11pt,oneside]{scrartcl}
%=====================================================
\RequirePackage[utf8]{inputenc}
\RequirePackage{ifmtarg}
%=====================================================
\newcommand*{\@firsthandin}{}
\newcommand{\firsthandin}[1]{\renewcommand{\@firsthandin}{#1}}

\newcommand{\@secondhandin}{Unknown}
\newcommand{\secondhandin}[1]{\renewcommand{\@secondhandin}{#1}}

\renewcommand{\maketitle}{%
\begin{titlepage}
  \centering
  \begin{tabular}{ll}
  \expandafter\@ifnotmtarg\expandafter{\@firsthandin}{First date & \@firsthandin \\}%
  Second date & \@secondhandin \\
  \end{tabular}
  \end{titlepage}%
}

table首先,不需要环境;然后正确的命令是\@ifmtarg,但\@ifnotmtarg在这里更容易;你也缺少一个括号。

您需要展开\@firsthandin才能看到它是否为空。

mwe.tex

\documentclass[a4paper,fontsize=11pt,oneside]{protokoll}

\firsthandin{05.01.2017}

\begin{document}

\maketitle

\end{document}

输出

在此处输入图片描述

相关内容