编辑

编辑

我正在使用大学开发的文档类来完成我的论文。此类具有命令\keywords,该命令接受命令列表\key,并将其作为关键字列表打印在摘要之后。这些命令在葡萄牙语中分别被屏蔽为\chaves\chave

示例输入为:

\chaves{%
  \chave{A}%
  \chave{B}%
  \chave{C}%
  \chave{D}%
}

不幸的是,这个列表目前完全以句点分隔打印,这与大学的标准不同(尽管它是由大学开发的,但可以想象),所以我必须修改文档类才能使其正常工作。

我进入文档类并发现了这一点:

\newcommand{\key}[1]{}
\newcommand{\puc@keywords}{}
\newcommand{\keywords}[1]{\renewcommand{\puc@keywords}{#1}}
\newcommand{\chave}[1]{\key{#1}}
\newcommand{\chaves}[1]{\keywords{#1}}
% ...
\renewcommand{\key}[1]{##1.\hspace{3mm} }%
\indent \puc@keywords%

修改\renewcommand{\key}##1;\hspace{3mm},我得到了用分号分隔的列表,这是正确的。不幸的是,只有列表中的最后一项也打印了分号,而它应该是句点。

我曾尝试使用xstring包删除最后一个分号并打印句点,但没有成功。修改上面的代码片段,并将最后一行替换为\indent \StrGobbleRight{\puc@keywords}{2}%,我得到了错误Argument of \reserved@a has an extra }.我查找过这个错误,但还没弄明白。我试过在调用\protect周围放置,但\chave没有成功。我试过在调用周围放置\makeatletter\makeatother,但这也无济于事。我试过使用\StrExpand来扩展调用,但也没有用。我能够让它\StrExpand与一起工作\StrExpand[1]{\puc@keywords}{\test},之后打印就可以了\test。但是,如果我尝试\StrGobbleRight{\test}{2},我会得到TeX capacity exceeded, sorry [input stack size=5000].

我认为我的错误主要是概念上的,但如果它有任何用处,下面遵循 MWE,但问题实际上是处理一个(1100+行)类文件,可以找到这里。相关代码在608行左右。

\documentclass[dissertacao,brazil]{ThesisPKKN3}
\usepackage[T1]{fontenc}

\autor{A}
\autorR{A}
\orientador{A}
\orientadorR{A}
\titulo{A}
\dia{20} \mes{Março} \ano{2015}
\cidade{Rio de Janeiro}
\CDD{A}
\departamento{A}
\programa{A}
\centro{A}
\universidade{Pontifícia Universidade Católica do Rio de Janeiro}
\uni{PUC-Rio}
\banca{
  \membrodabanca{A}{PUC-Rio}
  \membrodabanca{A}{USP}
  \membrodabanca{A}{PUC-Rio}
  \coordenador{A}
}
\curriculo{%
A}
\agradecimentos{%
A
}
\chaves{%
  \chave{A}%
  \chave{A}%
  \chave{A}%
  \chave{A}%
}
\resumo{
A
}
\chavesuk{
  \chave{A}%
  \chave{A}%
  \chave{A}%
  \chave{A}%
}
\titulouk{A}
\resumouk{%
A
}
\modotabelas{figtab} % nada, fig, tab ou figtab
\begin{document}
\chapter{Introdução}
    \section{Objetivos}
\chapter{Protensão}
    \section{Introdução}
\chapter{Implementação do programa}
    \section{Introdução}
\chapter{Passo-a-passo do programa com exemplo}
\chapter{Demais exemplos}
    \section{Viaduto da Guarita - Pista Norte}
\chapter{Conclusões}
    \section{Sugestões para trabalhos futuros}
\chapter{Dados dos exemplos}
    \section{Viaduto de acesso a Santa Isabel}
\end{document}

编辑:

在@cfr 的评论和回答之后,我注意到我没有提到关键字在其他地方重复的事实,在这种情况下关键字由句点分隔(我讨厌我大学的格式),那么有没有一种方法可以做到这一点,允许分隔符灵活性?

答案1

既然你无论如何都要重写这部分,为什么不让它更简单,并进行设置,这样你就可以以逗号分隔的列表形式输入关键字?如果关键字包含逗号,只需用花括号括起来即可。

\documentclass{article}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\makeatletter
\clist_new:N \l_wasabi_chaves_clist
\NewDocumentCommand\chaves { m }
{
  \clist_set:Nn \l_wasabi_chaves_clist { #1 }
}
\NewDocumentCommand \puc@keywords {}
{
  \clist_use:Nnnn \l_wasabi_chaves_clist { ;~ }{ ;~ }{ ;~ }.
}
\let\test\puc@keywords
\makeatother
\ExplSyntaxOff
\begin{document}
  \chaves{abc, def, 5 and three-quarters, {red, white and blue}, Tall interventions, little green men, large purple women, Sam's childrens' sea-shells}
  \test
\end{document}

关键词

编辑

针对更新的问题和信息,最简单的方法可能是创建\puc@keywords[]一个可选参数。我已将其设置为默认由分号和空格组成,但如下所示,您也可以\puc@keywords[.\hspace{3mm}]在需要的其他位置使用它。

\documentclass{article}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\makeatletter
\clist_new:N \l_wasabi_chaves_clist
\NewDocumentCommand\chaves { m }
{
  \clist_set:Nn \l_wasabi_chaves_clist { #1 }
}
\NewDocumentCommand \puc@keywords { O {;} }
{
  \clist_use:Nnnn \l_wasabi_chaves_clist { #1~ }{ #1~ }{ #1~ }.
}
\def\test{
  \puc@keywords\par
  \puc@keywords[.\hspace{3mm}]
}
\makeatother
\ExplSyntaxOff
\begin{document}
  \chaves{abc, def, 5 and three-quarters, {red, white and blue}, Tall interventions, little green men, large purple women, Sam's childrens' sea-shells}
  \test
\end{document}

标点关键词的两种方法

相关内容