我想将一系列 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 加倍”,代码更加透明。