我在制作毕业论文模版的时候使用xparse里的NewDocumentCommand命令实现当论文标题含有副标题时,用户在main.tex文件中输入
\title={主标题},
\subtitle={副标题},
结果输出为
;
当论文标题没有副标题时,用户在main.tex文件中输入
\title={主标题},
\subtitle={},
结果输出为
。我目前尝试的代码在第二种情况显示的结果为
\newcommand*{\title}[1]{\gdef\@title{#1}} %定义主标题变量
\newcommand*{\subtitle}[1]{\gdef\@subtitle{\relax #1}} %定义副标题变量
\NewDocumentCommand{\PrintTitle}{mg}
{
\IfNoValueTF {#2}
{#1}%
{#1 \\ \flushright ——#2}
}
\newcommand{\TITLE}
{
\IfNoValueTF {\subtitle}
{\PrintTitle{\title}}
{\PrintTitle{\title}{\subtitle}}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%输出文本
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\flushleft \zihao{-2} \heiti 题\quad 目:\TITLE \\
请问应该如何解决,谢谢
先给出修改后的代码:
\makeatletter
\def\@subtitle{}
%% 下面两行一般是不用的
%\def\@title{}
%\newcommand*{\title}[1]{\gdef\@title{#1}} %定义主标题变量
\newcommand*{\subtitle}[1]{\gdef\@subtitle{\relax #1}} %定义副标题变量
\NewDocumentCommand{\PrintTitle}{mg}
{%
\IfNoValueTF {#2}
{#1}%
{#1 \\ \flushright ——#2}%
}
\newcommand{\TITLE}
{%
\ifx\@subtitle\@empty
\PrintTitle{\@title}\relax
\else
\PrintTitle{\@title}{\@subtitle}%
\fi
}
\makeatother
使用时
\title{主标题}
\flushleft \zihao{-2} \heiti 题\quad 目:\TITLE \\
或,
\title{主标题}
\subtitle{副标题}
\flushleft \zihao{-2} \heiti 题\quad 目:\TITLE \\
\title
和 \subtitle
的作用是存储其参数到 \@title
和 \@subtitle
中,\ifx\@subtitle\@empty
是检测 subtitle 是否为空。
TeX 不使用“重载”这一概念,甚至没有“函数”这一概念,TeX 是一门宏语言,与其它编程语言的工作方式并不相同。
完整示例:
\documentclass{ctexart}
%\usepackage{xparse}
\makeatletter
\def\@subtitle{}
%\newcommand\@title{}
%\newcommand*{\title}[1]{\gdef\@title{#1}} %定义主标题变量
\newcommand*{\subtitle}[1]{\gdef\@subtitle{\relax #1}} %定义副标题变量
\NewDocumentCommand{\PrintTitle}{mg}
{%
\IfNoValueTF {#2}
{#1}%
{#1 \\ \flushright ——#2}%
}
\newcommand{\TITLE}
{%
\ifx\@subtitle\@empty
\PrintTitle{\@title}\relax
\else
\PrintTitle{\@title}{\@subtitle}%
\fi
}
\makeatother
\begin{document}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%输出文本
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\title{主标题}
\subtitle{副标题}
\flushleft \zihao{-2} \heiti 题\quad 目:\TITLE \\
\end{document}
非常感谢