在带参数的扩展宏上使用 \MakeUppercase

在带参数的扩展宏上使用 \MakeUppercase

我想将扩展宏中的第一个字母转换为大写,但我似乎无法做到这一点。在下面的最小示例中,我希望两行产生相同的输出,即第一个字母大写,但第二行的所有字母均为小写。

\documentclass[a4paper, 10pt]{report}
\usepackage[utf8]{inputenc} 
\usepackage[printonlyused]{acronym}
\usepackage{etoolbox}

%%% Begin document
\begin{document}

\begin{acronym}
\acro{rms}{root mean square}
\end{acronym}

\section{Text}
\MakeUppercase root mean square (\acs{rms})

\expandafter\MakeUppercase\expandafter\empty\ac{rms}

\end{document}

输出

我该如何解决这个问题?

编辑:

看来这个最小示例太小了。建议的解决方案不适用于文档的其余部分。这是一个更完整的最小示例。

\documentclass[a4paper, 10pt]{report}
\usepackage[utf8]{inputenc} 
\usepackage{acronym}
\usepackage{etoolbox}

\newif\ifAcUpper
\AcUpperfalse

\makeatletter
\patchcmd{\AC@@acro}{] #3}{] \expandafter\MakeUppercase #3}{}{}
\patchcmd{\AC@@acro}{] #3}{] \expandafter\MakeUppercase #3}{}{}
\makeatother

\newif\ifACR
\ACRfalse

\makeatletter
\newcommand{\acx}{\protect\@acx}%
\newcommand{\@acx}[1]{%
\ifAC@dua
    \acl{#1}%
\else
    \expandafter\ifx\csname ac@#1\endcsname\AC@used
       \acs{#1}%
    \else
       \acl{#1}%
    \fi
\fi
}

\newcommand{\acy}{\protect\@acy}%
\newcommand{\@acy}[1]{%
  \ifACR
    \acl{#1}%
  \else
    \acf{#1}
  \fi
}

\newcommand{\dac}{\protect\@dac}%
\newcommand{\@dac}[1]{%
  \ifAC@dua
    the \acl{#1}%
  \else
    \expandafter\ifx\csname ac@#1\endcsname\AC@used
      \acs{#1}%
    \else
      the \acf{#1}%
    \fi
  \fi
}

\newcommand{\Dac}{\protect\@Dac}%
\newcommand{\@Dac}[1]{%
  \ifAC@dua
    The \acl{#1}%
  \else
    \expandafter\ifx\csname ac@#1\endcsname\AC@used
      \acs{#1}%
    \else
     The \acf{#1}%
    \fi
  \fi
}

\newcommand{\Ac}{\@Ac}%
\newcommand{\@Ac}[1]{%
  \ifAC@dua
    \acl{#1}%
  \else
    \expandafter\ifx\csname ac@#1\endcsname\AC@used
      \acs{#1}%
    \else
        \expandafter\MakeUppercase\expandafter\empty\ac{#1}
    \fi
  \fi
}
\makeatother

%%% Begin document
\begin{document}

\begin{acronym}
\ACRtrue
\acro{dc}[DC]{Direct Current}
\acro{pu}[p.u.]{per unit}
\acro{rms}[rms]{root-mean-square}
\acro{b}[$B$]{magnetic flux density}
\acro{hor}[$H$]{horizontal component of the \acx{b}}
\acro{d}[$D$]{electric displacement of \acx{b}}
\acro{h}[$H$]{magnetic field intensity}
\acro{rdc}[$R_{DC}$]{\acy{dc} resistance}
\acro{phi}[$\phi$]{magnetic flux}
\acro{sbase}[$S_{base}$]{\acy{pu} power base}
\acro{ubase}[$U_{base}$]{\acy{pu} voltage base}
\acro{phibase}[$\Phi_{base}$]{\acy{pu} \acx{phi} base}
\acro{udc}[$U_{DC}$]{\acy{dc} voltage}
\acro{idc}[$I_{DC}$]{\acy{dc} current}
\ACRfalse
\end{acronym} 

\section{Text}
\MakeUppercase root mean square (\acs{rms})

\Ac{rms}

\end{document}

输出如下

输出2

我希望\Ac命令生成以大写字母开头的一行,并且列表中的所有描述都执行相同的操作。

答案1

您需要将大写字母插入到 的结果中\ac,但\ac无法通过扩展来实现,因此\expandafter没有帮助。(如果它通过扩展起作用,那么当它传递\empty给 时,您的表达式仍然是错误的\MakeUppercase

\documentclass[a4paper, 10pt]{report}
\usepackage[utf8]{inputenc} 
\usepackage[printonlyused]{acronym}
\usepackage{etoolbox}

%%% Begin document
\begin{document}
\DeclareRobustCommand\zz[1]{#1}
\begin{acronym}

\acro{rms}{\zz{r}oot mean square}

\end{acronym}

\section{Text}
\MakeUppercase root mean square (\acs{rms})

%\expandafter\MakeUppercase\expandafter\empty\ac{rms}

{\renewcommand\zz{\MakeUppercase}\ac{rms}}

\end{document}

相关内容