如何在我的类中定义带有可选参数的这样的命令?

如何在我的类中定义带有可选参数的这样的命令?

我正在准备一个文档类:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}
\LoadClass{book}
\RequirePackage[demo]{graphicx}
\newcommand{\@mypic}[1]{%
\includegraphics[width=.3\textwidth]{pic1}
}

\newcommand{\mytitlepage}{
\begin{center}
Title 

\@mypic


Jan 2015
\end{center}
}

这是我的根文件:

\documentclass{myclass}
\begin{document}
\mytitlepage
\end{document}

我的问题出在\@mypic命令上。我希望此命令默认加载图形,但如果用户不喜欢默认图形,我也希望他们能够在序言中加载他们的图形。换句话说,我想要这样:如果他们输入像序言中的pic1命令,则用替换。\mypic[.6]{pic3}pic3pic1.6\textwidth
我怎样才能做到这一点?

编辑(更清晰的解释):

我想要的是:
如果我的用户不喜欢默认图形及其宽度,他们可以同时更改图形及其宽度。我认为这个问题有一个简单的解决方案。
顺便说一句,解决方案最好只使用 latex 核心,而不是使用像 这样的包xparse

答案1

我将使用键值语法,例如提供的语法expl3

文件sisabe.cls

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{sisabeclass}
\LoadClass{book}

\RequirePackage{graphicx,xparse}

\ExplSyntaxOn
\NewDocumentCommand{\mytitlepage}{ O{} }
 {
  \begin{center}
  \keys_set:nn { sisabeclass / titlepage } { #1 }
  \g_sisabe_titlepage_title_tl
  \par
  \vspace{1cm} % adjust
  \sisabe_titlepage_picture:VV \l_sisabe_titlepage_picoptions_tl \l_sisabe_titlepage_picture_tl
  \par
  \vspace{1cm} % adjust
  \g_sisabe_titlepage_date_tl
  \end{center}
 }

\keys_define:nn { sisabeclass / titlepage }
 {
  title   .tl_gset:N = \g_sisabe_titlepage_title_tl,
  title   .initial:n = MISSING TITLE,
  date    .tl_gset:N = \g_sisabe_titlepage_date_tl,
  date    .initial:n = MISSING DATE,
  options .tl_set:N  = \l_sisabe_titlepage_picoptions_tl,
  options .initial:n = { width=.3\textwidth },
  picture .tl_set:N  = \l_sisabe_titlepage_picture_tl,
  picture .initial:n = { example-image.pdf }, % adjust
 }

\cs_new_protected:Npn \sisabe_titlepage_picture:nn #1 #2
 {
  \includegraphics[#1]{#2}
 }

\cs_generate_variant:Nn \sisabe_titlepage_picture:nn { VV }

\ExplSyntaxOff

\endinput

文件test.tex

\documentclass{sisabe}

\begin{document}

\mytitlepage

\hrule

\mytitlepage[
  title = A wonderful paper,
  date = January 2015,
  picture = example-image-9x16.pdf,
  options = {height=4cm},
]

\end{document}

输出

在此处输入图片描述


sisabe.cls仅使用已加载的功能的文件graphicx

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{sisabeclass}
\LoadClass{book}

\RequirePackage{graphicx} % already loads keyval

\newcommand{\mytitlepage}[1][]{%
  \begin{center}
  \setkeys{sisabetitle}{#1}
  \sisabetitlepage@title
  \par
  \vspace{1cm} % adjust
  \begingroup\edef\x{\endgroup
    \noexpand\includegraphics[\sisabetitlepage@picoptions]{\sisabetitlepage@picture}%
  }\x
  \par
  \vspace{1cm} % adjust
  \sisabetitlepage@date
  \end{center}
 }

\define@key{sisabetitle}{title}{\gdef\sisabetitlepage@title{#1}}
\define@key{sisabetitle}{date}{\gdef\sisabetitlepage@date{#1}}
\define@key{sisabetitle}{options}{\def\sisabetitlepage@picoptions{#1}}
\define@key{sisabetitle}{picture}{\def\sisabetitlepage@picture{#1}}
\setkeys{sisabetitle}{%
  title=MISSING TITLE,
  date=MISSING DATE,
  options={width=.3\textwidth},
  picture={example-image.pdf},% adjust
 }
\endinput

和同一个测试文件的输出是完全一样的。

答案2

这提供了两种可能的方式来定义带有一些可选参数的命令——经典\newcommand风格和使用\NewDocumentCommand。如果省略可选参数,则pic1使用,否则使用 #1 的值作为可选参数。

通过键值接口可以实现更多的可配置性。

班级:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}
\LoadClass{book}
\RequirePackage{graphicx}

\RequirePackage{xparse}

\newcommand{\@mypic}[1]{%
  \includegraphics[width=.3\textwidth]{#1}%
}




\newcommand{\mytitlepage}[1][pic1]{
\begin{center}
Title  

\@mypic{#1}%


Jan 2015
\end{center}
}



\NewDocumentCommand{\MyTitlePage}{+O{pic1}}{%
\begin{center}
Title NewDocumentCommand-like 

\@mypic{#1}

\today
\end{center}
}%

文档:

\documentclass{myclass}

\begin{document}
\mytitlepage
\mytitlepage[bild_erwin_schroedinger]

\MyTitlePage[bild_erwin_schroedinger]

\MyTitlePage
\end{document}

答案3

我已经使用标准类完成了此操作,但您可以将这些宏实现到您的类中。我\mytitlepage有两个可选参数。第一个必须是调整大小,第二个是图像替换。

因此,如果您想要一张新图像,则必须指定大小分数参数。但是,我已编辑答案,以便将第一个可选参数留空,如\mytitlepage[][example-image-B]将保留默认大小.3\textwidth

\documentclass{article}
\RequirePackage{graphicx}
\makeatletter
\newcommand{\@mypic}[2]{\includegraphics[width=#1\textwidth]{#2}}
\newcommand{\mytitlepage}[1][.3]{%
  \ifx\relax#1\relax\def\figwidth{.3}\else\def\figwidth{#1}\fi%
  \mytitlepagehelp}
\newcommand{\mytitlepagehelp}[1][example-image-A]{%
\begin{center}
Title\par
\@mypic{\figwidth}{#1}\par
Jan 2015
\end{center}
}
\makeatother
\begin{document}
\mytitlepage
\mytitlepage[.4]
\mytitlepage[.4][example-image-B]
\mytitlepage[][example-image-C]
\end{document}

在此处输入图片描述

相关内容