我正在准备一个文档类:
\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}
pic3
pic1
.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}