\newcommand 中的 \input 和宏参数

\newcommand 中的 \input 和宏参数

我想将一系列 tikz 图形的参数列表分成一堆单独的、名为 tex 的文件。

具体来说:每个参数文件都应该由一个命令加载,\input而该命令又包含在一个累积的定义中\newcommand,请参阅setspecs-命令.tex以下。

本身\newcommand是通过另一个加载\input主文本文件。

我天真地以为\newcommand参数数字 eg#1会在输入的文件中起作用,但我收到了错误消息:

./parameters1.tex:5:
Illegal parameter number in definition of \tikz@math@marshal.

相关错误信息:

./parameters1.tex:1: You can't use `macro parameter character #' in horizontal mode.

来自于打印输入文件内的参数值,例如插入以下行:

Parameter file #1 was loaded.

\tikzmath在环境之前参数1.tex

关于如何处理\newcommand通过加载的文件内的宏参数有什么想法\input吗?

完整 MWE 如下:

主文本

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{math}

%%
%Courtesy of egreg, see https://tex.stackexchange.com/questions/415138
\usepackage{pdftexcmds}
\makeatletter
\newcommand{\strequal}[2]{\pdf@strcmp{#1}{#2}==0}
\makeatother
%%

\input{setspecs-command}

\begin{document}
First graphic:\\
\setspecs{parameters2}
\begin{tikzpicture}
    \draw (-2,-2) rectangle (2,2);
    \node at (0,0) {\var};
\end{tikzpicture}
\clearpage

Then second graphic:\\
\setspecs{parameters1}
\begin{tikzpicture}
    \draw (-2,-2) rectangle (2,2);
    \node at (0,0) {\var};
\end{tikzpicture}
\end{document}

包含 setspecs 命令定义的文件:

setspecs-命令.tex

\newcommand\setspecs[1]{
    \input{parameters1}
    \input{parameters2}
    %... further files to be added as and when needed
}

以下是两个参数文件的示例:

参数1.tex

%Parameter file #1 was loaded.
%All parameter files will have the following overarching structure
\tikzmath{
    if \strequal{#1}{parameters1} then {
        \var = 111;
    };
}

参数2.tex

\tikzmath{
    if \strequal{#1}{parameters2} then {
        \var = 222;
    };
}

答案1

它与下面的代码一起工作setspecs-command.tex,尽管我不完全理解你想要完成什么。

您需要添加\usepackage{catchfile}到文档序言中。

\newcommand{\setspecs}[1]{%
  \begingroup
  \CatchFileDef\temp{#1}{}%
  % double the #'s
  \toks0=\expandafter{\temp}%
  % define and evaluate
  \edef\x{\endgroup\def\noexpand\temp####1{\the\toks0}}\x\temp{#1}%
}

您可能对更简单的代码感兴趣:

\documentclass{article}
\usepackage{xparse}
\usepackage{tikz}
\usetikzlibrary{math}

\ExplSyntaxOn
\NewExpandableDocumentCommand{\strequal}{mm}
 {
  \str_if_eq:nnTF { #1 } { #2 } { 0==0~ } { 0==1~ }
 }
\NewDocumentCommand{\setspecs}{m}
 {
  \tl_set_from_file:Nnn \l__demodave_spec_tl {} { #1 }
  \cs_set:NV \__demodave_temp:n \l__demodave_spec_tl
  \__demodave_temp:n { #1 }
 }
\tl_new:N \l__demodave_spec_tl
\cs_generate_variant:Nn \cs_set:Nn { NV }
\ExplSyntaxOff


\begin{document}
First graphic:\\
\setspecs{parameters2}
\begin{tikzpicture}
    \draw (-2,-2) rectangle (2,2);
    \node at (0,0) {\var};
\end{tikzpicture}

\bigskip

Then second graphic:\\
\setspecs{parameters1}
\begin{tikzpicture}
    \draw (-2,-2) rectangle (2,2);
    \node at (0,0) {\var};
\end{tikzpicture}
\end{document}

parameters1.tex和的内容parameters2.tex完全相同。

这个想法和以前完全相同,但是expl3对于“将#'s 加倍”,代码更加透明。

相关内容