如何存储/附加代码以供日后使用

如何存储/附加代码以供日后使用

为了存储一些代码以供以后使用,我能想到两种方法:\apptofrometoolbox\sbox。它们在使用中都存在一些问题。

对于\appto,稍后调用宏将覆盖前者的值,如\ww“测试 1”中所示。

对于\sbox,代码中的所有宏都会立即展开。当宏的值必须稍后给出(如\parboxheightb测试 4 中所示)时,这很不方便。

那么,如何解决上述问题?以及如何\appto在嵌套宏中使用(请参见测试 5 中的示例)。另一个问题:为什么\\测试 3 中的代码不起作用?

梅威瑟:

    \documentclass[a4paper]{article}
    \usepackage{xcolor,pgf,etoolbox}
    \usepackage{geometry}
    \geometry{showframe}
    \geometry{left=1cm,right=1cm,top=1cm,bottom=1cm}
    \parindent0pt
    \begin{document}
    Test 1: Later invoke of \verb|\ww| covers the value of the former invoke.\par
    \newcommand\testa{
      \def\do{}
      \def\ww{2pt}
      \appto\do{\rule{1in}{\ww}\\}
      \def\ww{10pt}
      \appto\do{\rule{1in}{\ww}}
    }
    \testa\do
    
    Test 2: In this way, the value of \verb|\parboxheighta| can be given after \verb|appto|\par
    \newdimen\parboxheighta
    \def\do{}
    \newcommand\testc[1]{
      \appto\do{\fbox{\parbox[t][\parboxheighta]{#1}{first}}}
    }
    \testc{1in}\testc{2in}
    \setlength{\parboxheighta}{2in}
    \do
    
    Test 3: Why does \verb|\\| in code not work?\par
    \newcommand\testb{
      \sbox0{}
      \def\ww{2pt}
      \sbox0{\usebox0\rule{1in}{\ww}\\}
      \def\ww{10pt}
      \sbox0{\usebox0\rule{1in}{\ww}}
    }
    \testb\usebox0
    
    \iffalse
    Test 4: In this way, the value of \verb|\parboxheightb| is given after \verb|appto| which causes error.\par
    \newdimen\paboxheightb
    \sbox0{}
    \newcommand\testd[1]{
      \sbox0{\usebox0\parbox[t][\paboxheightb]{#1}{second}}
    }
    \setlength{\parboxheightb}{2in}
    \testb{1in}\testb{2in}\usebox0
    \fi

\iffalse
Test 5:How to use \verb|\appto| in nested macro?
\def\mycolor{red}
\def\mylength{1in}
\def\myexe{}
\appto\myexe{\colorbox}
\eappto\myexe{{\mycolor}}
\eappto\myexe{\{}
\appto\myexe{\parbox}
\eappto\myexe{{\mylength}}
\eappto\myexe{{xxx}}
\eappto\myexe{\}}
\myexe
\fi
    \end{document}

答案1

测试

平均能量损失

\documentclass[a4paper]{article}
\usepackage{xcolor,pgf,etoolbox}
\usepackage{geometry}
\geometry{showframe}
\geometry{left=1cm,right=1cm,top=1cm,bottom=1cm}
\parindent0pt
\begin{document}
Test 1: Later invoke of \verb|\ww| covers the value of the former invoke.\par

Use \verb|\eappto|:\par

\newcommand\testa{
  \def\do{}
  \def\ww{2pt}
   \appto\do{\rule{1in}}
   \eappto\do{{\ww}\\}
  \def\ww{10pt}
  \appto\do{\rule{1in}{\ww}}
}

\testa\do
%\show\ww


Test 2: In this way, the value of \verb|\parboxheighta| can be given after \verb|appto|\par
Do \verb|\def\do{}| inside \verb|\testc|:\par
\newdimen\parboxheighta
\newcommand\testc[1]{
    \def\do{}
  \appto\do{\fbox{\parbox[t][\parboxheighta]{#1}{xxx}}}
}
\setlength{\parboxheighta}{1in}
\testc{1in}\do
\setlength{\parboxheighta}{2in}
\testc{1in}\do

Test 3: Why does \verb|\\| in code not work?\par
\newcommand\testb{
  \sbox0{}
  \def\ww{2pt}
  \sbox0{\rule{1in}{\ww}}
  \def\ww{10pt}
  \sbox0{\begin{minipage}{\linewidth}\usebox0\\\rule{1in}{\ww}\end{minipage}}
}
\testb\usebox0

\verb|\sbox| uses LR mode (no linebreaks): insert a minipage: see \texttt{texdoc latex2e}.

%\iffalse
%Test 4: In this way, the value of \verb|\parboxheightb| is given after \verb|appto| which causes error.\par
%\newdimen\paboxheightb
%\sbox0{}
%\newcommand\testd[1]{
%  \sbox0{\usebox0\parbox[t][\paboxheightb]{#1}{second}}
%}
%\setlength{\parboxheightb}{2in}
%\testb{1in}\testb{2in}\usebox0
%\fi
\end{document}

相关内容