如何创建使用带百分比的字符串的新命令?

如何创建使用带百分比的字符串的新命令?

我正在一个小组工作,该小组创建了一个网站,供小组成员提交有关他们每周工作的简短介绍,这是使用类似 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}

在此处输入图片描述

相关内容