我正在一个小组工作,该小组创建了一个网站,供小组成员提交有关他们每周工作的简短介绍,这是使用类似 TeX 的设置完成的。
不幸的是,管理员已将一些命令更改为无法在正常 TeX 设置中从我的计算机直接运行的命令,我想在提交之前在我自己的机器上编写我的演示文稿。
其中一个命令是\includegraphics
。这样,如果我想包含图像,也许使用\includegraphics[width=.3\linewidth]{stuff.png}
,这现在相当于\image{stuff.png}{width="30%"}
。
如果我不想包含宽度,我只需设置
\newcommand{\image}{\includegraphics[width=\linewidth]}
然而,这意味着宽度始终设置为线宽的 100%。
所以问题就变成了:我如何包含一个可变的宽度——直接使用百分比字符设置的宽度?
答案1
\documentclass{article}
\usepackage{xparse,xfp,graphicx}
\makeatletter
\def\isnum#1{\pst@isnum@i\zap@space#1 \@empty\@nil}%
\def\pst@isnum@i#1\@nil{%
\if!\ifnum9<1#1!\else_\fi%
\expandafter\@firstoftwo%
\else%
\expandafter\@secondoftwo%
\fi}
\NewDocumentCommand\image{ m v }{%
\if$#2$\edef\IScale{100}\else\checkScale#2\@nil\fi
\includegraphics[scale=\fpeval{\IScale/100}]{#1}%
}
\def\checkScale#1="#2#3#4#5\@nil{%
\isnum{#2#3#4}{\edef\IScale{#2#3#4}}{%
\isnum{#2#3}{\edef\IScale{#2#3}}{\edef\IScale{#2}}}%
}%
\makeatother
\begin{document}
\image{tiger}{width="30%"}
\image{tiger}{width="3%"}
\image{tiger}{width="100%"}
\image{tiger}{}% same as 100%
\end{document}
答案2
您的管理员对 TeX 有不好的想法:%
是一个非常特殊的字符。
我不确定 相比 有什么\image{name}{width="30%"}
优势\includegraphics[width=0.3\linewidth]{name}
。
以下方法有效,并且允许设置显式宽度。但是,不要尝试将其用作\image
另一个命令的参数。
\documentclass{article}
\usepackage{xparse}
\usepackage{graphicx}
\ExplSyntaxOn
\NewDocumentCommand{\image}{m}
{
\group_begin:
\char_set_catcode_other:n { `\% }
\peek_catcode:NTF \c_group_begin_token
{
\anders_image:nn { #1 }
}
{
\anders_image:nn { #1 } { }
}
}
\cs_new_protected:Nn \__anders_image_include:nn
{
\includegraphics[width=#1]{#2}
}
\cs_generate_variant:Nn \__anders_image_include:nn { x }
\cs_generate_variant:Nn \__anders_image_include:nn { V }
\cs_new_protected:Nn \anders_image:nn
{
\tl_if_blank:nTF { #2 }
{
\keys_set:nn { anders/image } { width=\linewidth }
}
{
\keys_set:nn { anders/image } { #2 }
}
\str_if_eq:eeTF { " } { \tl_head:N \l__anders_image_width_tl }
{
\__anders_image_include:xn
{
\fp_eval:n
{
(\tl_range:Nnn \l__anders_image_width_tl { 2 } { -3 })/100
}
\linewidth
}
{ #1 }
}
{
\__anders_image_include:Vn \l__anders_image_width_tl { #1 }
}
\group_end:
}
\keys_define:nn { anders/image }
{
width .tl_set:N = \l__anders_image_width_tl,
}
\ExplSyntaxOff
\begin{document}
\centering
\image{example-image}
\image{example-image}{width="30%"}
\image{example-image}{width=0.3\textwidth}
\image{example-image}{width=2cm}
\end{document}