我想使用\csname
inside \IfStrEqCase
,但出现错误。这是我的代码:
\documentclass[a4paper,12pt,hidelinks]{article}
\usepackage[utf8]{inputenc}
\usepackage[brazil]{babel}
\usepackage[T1]{fontenc}
\usepackage{filecontents}
\usepackage{xstring}
\usepackage{alphalph}
\usepackage{etoolbox}
\usepackage{tikz}
\usepackage{forloop}
%dados-a
\newcommand {\auxsistelet}[3]{\IfStrEq{#2}{BICICLETA}{\IfStrEqCase{#1} {{}{Seus sistemas de segurança para o tráfego (freio e direção) atuavam a contento}{n}{Seus componentes de segurança para o tráfego (direção e freio) não puderam ser testados devido à magnitude dos danos ocasionados pelo acidente}}[Seus sistemas de segurança para o tráfego (freio e direção) atuavam a contento, excetuando-se #1, face aos danos sofridos no evento]
}{
\IfStrEqCase{#1}{{}{Seus sistemas de segurança para o tráfego (freio, direção e elétrico) atuavam a contento}{n}{Seus componentes de segurança para o tráfego (direção, freio e elétrico) não puderam ser testados devido à magnitude dos danos ocasionados pelo acidente}}[\IfStrEq{#1}{chave} {\IfStrEq{#3}{s}{Seus componentes de segurança para o tráfego (direção, freio) funcionavam a contento. O sistema elétrico não pôde ser testado devido à ausência da chave do referido veículo}{Seus componentes de segurança para o tráfego (direção, freio e elétricos) não puderam ser testados devido à ausência da chave do referido veículo. Da mesma forma, fica prejudicada a análise de sua porção interna}}{Seus sistemas de segurança para o tráfego (freio, direção e elétricos) atuavam a contento, excetuando-se #1, face aos danos sofridos no evento}]}.}
%dados
\newcommand \placa {AAA-0000}
\newcommand \eletrico{\sistelet{n}\\}
\newcommand \tipoveiculo {AUTOMÓVEL}
\newcommand \moto {n}
\newcommand \placab {BBB-0000}
\newcommand \eletricob{\sisteletb{}\\}
\newcommand \tipoveiculob {MOTOCICLETA}
\newcommand \motob {s}
\begin{document}
\ifdef{\placa}{\newcommand \sistelet[1]{\auxsistelet{#1}{\tipoveiculo} {\moto}}}{}
\ifdef{\placab}{\newcommand \sisteletb[1]{\auxsistelet{#1} {\tipoveiculob}{\motob}}}{}
% \foreach \x in {b,...,e}{
% \ifcsdef{placa\x}{\expandafter\global\newcommand \csname sistelet\x\endcsname[1]{\csname auxsistelet\x\endcsname{#1}{\csname tipoveiculo\x\endcsname}{\csname moto\x\endcsname}}}{}
% }
\ifdef{\eletrico}{\eletrico}{}
\ifdef{\eletricob}{\eletricob}{}
\end{document}
我想改变这一点:
\ifdef{\placab}{\newcommand \sisteletb[1]{\auxsistelet{#1} {\tipoveiculob}{\motob}}}{}
对于这样的事情:
\foreach \x in {b,...,e}{
\ifcsdef{placa\x}{\expandafter\global\newcommand \csname sistelet\x\endcsname[1]{\csname auxsistelet\x\endcsname{#1}{\csname tipoveiculo\x\endcsname}{\csname moto\x\endcsname}}}{}
}
我该怎么办?帮帮我!
答案1
我不明白你想做什么,但这\expandafter\global\newcommand
是错误的,你可能想要\global\expandafter\newcommand\csname...\endcsname[1]{...}
,但那也行不通,因为\newcommand
检查各种事物是不可扩展的,并且\global
不会产生效果。但
\long\global\expandafter\def\csname...\endcsname #1{...}
有效。正如我在你的另一个问题中评论的那样如何使用 \global \foreach?,你可以使用,\csgdef
因为你已经加载了etoolbox
。或者,不使用包,因为你正在使用 LaTeX:
\makeatletter
\long\global\@namedef{...}#1{...}
\makeatother
如果在宏中使用,则#1
在上面的定义中用##1
. 替换(并且该\makeatletter/\makeatother
对不能在宏内部,而必须围绕它)。
答案2
通过这种方式解决:
\ifdef{\placa}{\newcommand \sistelet[1]{\auxsistelet{#1}{\tipoveiculo}{\moto}}}{}
\ifnumcomp{\nveics}{>}{1}{
\foreach \x in {b,...,\alphalph{\nveics}}{
\ifcsdef{placa\x}{\csgdef{sistelet\x}##1{\auxsistelet{##1}{tipoveiculo\x}{moto\x}}}{}
}
}{}