LaTeX3-与 `\def` 等效吗?

LaTeX3-与 `\def` 等效吗?

在下面的 MWE 中,我使用\def\path{numworks/\int_use:N \l__test_this_step_int.png}\includegraphics[scale = #3]{\path}

我可以避免使用\def“纯” LaTeX3 编码风格吗?

注意:我的代码的下一步将是用用户给出的?参数中的实际步数计数器替换。numworks/?.png

\documentclass[a4paper, 12pt]{article}

\usepackage{graphicx}
\usepackage{multicol}

\usepackage{expl3}
\usepackage{xparse}


\ExplSyntaxOn

\int_new:N \l__test_max_step_int
\int_new:N \l__test_this_step_int

\DeclareDocumentCommand\screensteps{vvv}{
    \int_set:Nn \l__test_max_step_int{#1}
    \int_set:Nn \l__test_this_step_int{0}
    
% Lets' print the material...
    \int_do_while:nn {\l__test_this_step_int < \l__test_max_step_int} {
        \int_gincr:N \l__test_this_step_int
        
        \int_if_odd:nTF { \l__test_this_step_int } {
            \begin{multicols}{2}
                \centering
        }{
                \columnbreak
        }
            
                \par\emph{Étape \ \int_use:N \l__test_this_step_int.}
        
                \par\smallskip
                
                %%%%%%%%%%%%     HERE
                \def\path{numworks/\int_use:N \l__test_this_step_int.png}
                %%%%%%%%%%%%     HERE
                \includegraphics[scale = #3]{\path}

        \int_if_even:nT{ \l__test_this_step_int } {
            \end{multicols} 
        }
    }
}

\ExplSyntaxOff


\begin{document}

\screensteps{6}{numworks/?.png}{.6}

\end{document}

答案1

\def非常通用,因此很大程度上取决于您想要做什么。如果您想要\def“定义命令”,那么您需要\cs_new(_protected):Npn。如果您想要\def“存储一些数据”,那么您需要\tl_set:Nn。这里您想要存储图像的路径,因此肯定是后者。此外,图像路径可以更具体地视为字符串,因此您可以使用\str_set:Nn

在下面的代码中,我使用了\str_set:Nx,这样参数中的任何用户宏都会被展开,并且已经添加到用当前步骤号\str_replace_all:Nnn替换所有?宏中。由于您只想无条件地从 1 循环到#1,因此您可以使用 ,\int_step_inline:nn而不是比较步骤号并每次增加计数器。如果您使用\int_step_inline:nn,那么您就可以像内联代码中一样获得当前循环索引##1

下面的例子尝试包含(numworks/1.pngnumworks/6.png失败了,因为我没有这些文件:)

\documentclass[a4paper, 12pt]{article}
\usepackage{graphicx}
\usepackage{multicol}
\usepackage{expl3}
\usepackage{xparse}

\ExplSyntaxOn
\str_new:N \l__test_path_str
\DeclareDocumentCommand \screensteps {mmm}
  {
    \int_step_inline:nn {#1}
      {
        \int_if_odd:nTF {##1}
          {
            \begin{multicols}{2}
              \centering
          }
          { \columnbreak }
        \par \emph {Étape ~ ##1 . }
        \par \smallskip
        \str_set:Nx \l__test_path_str {#2}
        \str_replace_all:Nnn \l__test_path_str { ? } {##1}
        \includegraphics[scale = #3]{\l__test_path_str}
        \int_if_even:nT {##1}
          { \end{multicols} }
      }
  }
\ExplSyntaxOff

\begin{document}
\screensteps{6}{numworks/?.png}{.6}
\end{document}

屏幕截图由 projetmbc 添加

在此处输入图片描述

相关内容