使用 \csname 时出现 \IfStrEqCase 问题

使用 \csname 时出现 \IfStrEqCase 问题

我想使用\csnameinside \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}}}{}
}
}{}

相关内容