Hier ist mein mwe.tex
\documentclass[12pt]{report}
\usepackage{xifthen}
\usepackage{xstring}
\def\test{\textnormal{test}}
\newcounter{wordCount}
\setcounter{wordCount}{0}
\newcounter{AllWord}
\setcounter{AllWord}{0}
\NewDocumentCommand{\exy}{ m m m}{%
\StrCount{#2}{,}[\comma]
\StrCount{#2}{?}[\qmark]
\ifthenelse{\qmark > 0}{%
\addtocounter{wordCount}{\comma + \qmark}
\addtocounter{AllWord}{\comma + \qmark}
}{%
\addtocounter{wordCount}{\comma + \qmark + 1}
\addtocounter{AllWord}{\comma + \qmark + 1}
}
\textbf{#2} (#3), ``#1''\\%
}
\begin{document}
\test\par
\exy{one \test}{two \test s}{three \test s}
\end{document}
Wenn Sie die Zeile mit auskommentieren, \exy
funktioniert es wie erwartet. Andernfalls beginnen die Fehler mit
[{
"resource": "/c:/Users/hsmye/LaTeX/Gaelic/vocab/mwe.tex",
"owner": "LaTeX",
"severity": 8,
"message": "Undefined control sequence.\n\\reserved@a ->\\@nil",
"source": "LaTeX",
"startLineNumber": 27,
"startColumn": 1,
"endLineNumber": 27,
"endColumn": 65536
}]
was über mein Makro-Know-how hinausgeht. Kann jemand helfen? Es sollte angemerkt werden, dass dies nicht das ursprüngliche Problem ist. Um ein MWE zu erstellen, ohne dass ein Schriftkauf erforderlich ist, habe ich so lange entfernt, bis kein Fehler mehr auftrat, und dann wieder hinzugefügt, um dies zu erhalten. Das ursprüngliche Problem war:
\newfontfamily{\EtGoudy}{P22 Goudy Ampersands}
\DeclareTextFontCommand{\GoudyEt}{\EtGoudy}
\newfontfamily{\cVirgi}{P22 Virginian}
\DeclareTextFontCommand{\Virgic}{\cVirgi}
\def\dispEt{\GoudyEt{c}\kern -3pt{\vspace{-0.01ex}\huge\Virgic{c}}.}
\def\Etc{\textnormal{\dispEt}}
ersetzen \test
durch \Etc
mit ähnlichen Ergebnissen.
Antwort1
Beachten Sie, dass Sie TeX-Fehler immer in mehrzeiliger Form anzeigen sollten, da die Zeilenumbrüche für das Verständnis der Meldung wichtig sind. Sie markierenwelcheBefehl ist nicht definiert
! Undefined control sequence.
\reserved@a ->\@nil
l.29 ...exy{one \test}{two \test s}{three \test s}
?
Sie haben eine TeX-Grunddefinition verwendet, was zu einem instabilen Befehl führt, der in einem Erweiterungskontext abbricht. Wenn Sie verwenden, \NewDocumentCommand
ist Ihr \protected
Befehl in solchen Konstrukten sicher.
Dies läuft ohne Fehler
\documentclass[12pt]{report}
\usepackage{xifthen}
\usepackage{xstring}
\NewDocumentCommand\test{}{\textnormal{test}}
\newcounter{wordCount}
\setcounter{wordCount}{0}
\newcounter{AllWord}
\setcounter{AllWord}{0}
\NewDocumentCommand{\exy}{ m m m}{%
\StrCount{#2}{,}[\comma]%%%%%%%%%%%%%%
\StrCount{#2}{?}[\qmark]%%%%%%%%%%%%%%
\ifthenelse{\qmark > 0}{%
\addtocounter{wordCount}{\comma + \qmark}%%%%%%%%%%%%%%
\addtocounter{AllWord}{\comma + \qmark}%%%%%%%%%%%%%%
}{%
\addtocounter{wordCount}{\comma + \qmark + 1}%%%%%%%%%%%%%%
\addtocounter{AllWord}{\comma + \qmark + 1}%%%%%%%%%%%%%%
}%%%%%%%%%%%%%%
\textbf{#2} (#3), ``#1''\\%
}
\begin{document}
\test\par
\exy{one \test}{two \test s}{three \test s}
\end{document}
Aber produziert
Underfull \hbox (badness 10000) in paragraph at lines 29--30
Aufgrund der falschen Platzierung \\
sollte es niemals am Ende eines Absatzes verwendet werden. (Es wäre besser, zu verwenden \par
.)
Antwort2
Ich würde nicht verwenden xstring
. Das Hauptproblem in Ihrem Code ist, dass der Befehl \Etc
(sehr) fragil ist.
Mein Vorschlag besteht expl3
darin, Kommas und Fragezeichen zu zählen, indem man den Text an dieser Stelle aufteilt und die Elemente zählt (und eins abzieht).
Das Argument wird vollständig erweitert (robuste Befehle hingegen nicht) und „bereinigt“, sodass Befehle wie \textnormal
verschwinden.
\documentclass[12pt]{report}
\newcommand\test{\textnormal{test}}
\NewDocumentCommand\dispEt{}{\GoudyEt{c}\kern -3pt{\huge\Virgic{c}}.}
\NewDocumentCommand\Etc{}{\textnormal{\dispEt}}
\newcommand\GoudyEt{}% just for testing
\newcommand{\Virgic}{}% just for testing
\newcounter{wordCount}
\newcounter{AllWord}
\ExplSyntaxOn
\NewDocumentCommand{\exy}{m m m}
{
\hsmyers_xyz_exy:nnen { #1 } { #2 } { \text_purify:n { \text_expand:n { #2 } } } { #3 }
}
\int_new:N \l_hsmyers_xyz_comma_int
\int_new:N \l_hsmyers_xyz_qmark_int
\cs_new_protected:Nn \hsmyers_xyz_exy:nnnn
{
\hsmyers_xyz_count:nnN { , } { #3 } \l_hsmyers_xyz_comma_int
\hsmyers_xyz_count:nnN { ? } { #3 } \l_hsmyers_xyz_qmark_int
\int_compare:nTF { \l_hsmyers_xyz_qmark_int > 0 }
{
\addtocounter{wordCount}
{
\int_eval:n { \l_hsmyers_xyz_comma_int + \l_hsmyers_xyz_qmark_int }
}
\addtocounter{AllWord}
{
\int_eval:n { \l_hsmyers_xyz_comma_int + \l_hsmyers_xyz_qmark_int }
}
}{%
\addtocounter{wordCount}
{
\int_eval:n { \l_hsmyers_xyz_comma_int + \l_hsmyers_xyz_qmark_int + 1}
}
\addtocounter{AllWord}
{
\int_eval:n { \l_hsmyers_xyz_comma_int + \l_hsmyers_xyz_qmark_int + 1}
}
}
\textbf{#2}~#4,~``#1''
}
\cs_generate_variant:Nn \hsmyers_xyz_exy:nnnn { nne }
\cs_new_protected:Nn \hsmyers_xyz_count:nnN
{
\seq_set_split:Nnn \l_tmpa_seq { #1 } { #2 }
\int_set:Nn #3 { \seq_count:N \l_tmpa_seq - 1 }
}
\ExplSyntaxOff
\begin{document}
\test\par
\exy{one \Etc}{two \test \Etc{} s}{three \Etc{} s}
wordCount=\the\value{wordCount}
AllWord=\the\value{AllWord}
\exy{one \test}{two, three?}{three \test s}
wordCount=\the\value{wordCount}
AllWord=\the\value{AllWord}
\end{document}