xstring Schriftart ändern

xstring Schriftart ändern

Einfache Frage. Ich habe zwei Makros zur Anzeige verkürzter Wochentage wie MWF oder TR. Ich bin mir nicht sicher, warum das erste Makro in meinem MWE fehlschlägt, während das zweite Makro funktioniert. Mir wäre es lieber, wenn etwas wie das erste Makro funktionieren würde, weil es kürzer ist.

\documentclass{article}
\usepackage{stix2}
\usepackage{suffix}
\WithSuffix\newcommand\textsc*[1]{%
    \textsc{\MakeLowercase{#1}}%
}
\usepackage{tikz}
\newcommand{\Repeat}[2]{%\repeat already used
    \foreach \n in {1,...,#1}{#2}%
}
\usepackage{xstring}
%\newcommand{\weekdays}[1]{%doesn't work
%   \textsc*{%
%       \IfSubStr{#1}{1}{N}{}%Sunday
%       \IfSubStr{#1}{2}{M}{}%Monday
%       \IfSubStr{#1}{3}{T}{}%Tuesday
%       \IfSubStr{#1}{4}{W}{}%Wednesday
%       \IfSubStr{#1}{5}{R}{}%Thursday
%       \IfSubStr{#1}{6}{F}{}%Friday
%       \IfSubStr{#1}{7}{S}{}%Saturday
%   }%
%}
\newcommand{\weekdays}[1]{%
    \IfSubStr{#1}{1}{\textsc*{N}}{}%Sunday
    \IfSubStr{#1}{2}{\textsc*{M}}{}%Monday
    \IfSubStr{#1}{3}{\textsc*{T}}{}%Tuesday
    \IfSubStr{#1}{4}{\textsc*{W}}{}%Wednesday
    \IfSubStr{#1}{5}{\textsc*{R}}{}%Thursday
    \IfSubStr{#1}{6}{\textsc*{F}}{}%Friday
    \IfSubStr{#1}{7}{\textsc*{S}}{}%Saturday
}
\begin{document}
\weekdays{246}\quad\weekdays{35}
\Repeat{7}{\par\weekdays{\n}}
\end{document}

Antwort1

Ich weiß nicht, warum man die Dinge komplizierter machen sollte, \MakeLowercasewenn man in der Definition einfach Kleinbuchstaben verwenden kann.

Befehle sind jedenfalls xstringnicht erweiterbar und das ist Ihr Problem.

Das Problem lässt sich möglicherweise mit lösen xstring, aber es gibt einen viel besseren Weg.

\documentclass{article}
\usepackage{stix2}
\usepackage{tikz}
\newcommand{\Repeat}[2]{%\repeat already used
    \foreach \n in {1,...,#1}{#2}%
}

\ExplSyntaxOn

\NewDocumentCommand{\textsmallcaps}{m}
 {
  \textsc { \text_lowercase:n { #1 } }
 }

\NewExpandableDocumentCommand{\weekdayinitial}{m}
 {
  \exp_args:Ne \str_map_function:nN { #1 } \egreg_weekday:n
 }

\cs_new:Nn \egreg_weekday:n
 {
  \str_case:nn { #1 }
   {
    {1}{N}
    {2}{M}
    {3}{T}
    {4}{W}
    {5}{R}
    {6}{F}
    {7}{S}
   }
 }

\NewDocumentCommand{\weekdays}{m}
 {
  \textsmallcaps { \weekdayinitial { #1 } }
 }

\ExplSyntaxOff

\begin{document}

\weekdays{246}\quad\weekdays{35}

\Repeat{7}{\par\weekdays{\n}}

\end{document}

Ich würde es nicht verwenden suffix.

Bildbeschreibung hier eingeben

Antwort2

Mit \textsc* \MakeLowercaseintern wird die vollständige Erweiterung über durchgeführt, \protected@edefwährend \IfSubStrnicht erweiterbar ist.
Sie können verwenden, \unexpandedum die Erweiterung zu verhindern.

\documentclass{article}
\usepackage{stix2}
\usepackage{suffix}
\WithSuffix\newcommand\textsc*[1]{%
    \textsc{\MakeLowercase{#1}}%
}
\usepackage{tikz}
\newcommand{\Repeat}[2]{%\repeat already used
    \foreach \n in {1,...,#1}{#2}%
}
\usepackage{xstring}
\DeclareRobustCommand{\weekdays}[1]{%
   \textsc*{%
     \unexpanded{%
       \IfSubStr{#1}{1}{N}{}%Sunday
       \IfSubStr{#1}{2}{M}{}%Monday
       \IfSubStr{#1}{3}{T}{}%Tuesday
       \IfSubStr{#1}{4}{W}{}%Wednesday
       \IfSubStr{#1}{5}{R}{}%Thursday
       \IfSubStr{#1}{6}{F}{}%Friday
       \IfSubStr{#1}{7}{S}{}%Saturday
     }%
   }%
}
\begin{document}
\weekdays{246}\quad\weekdays{35}
\Repeat{7}{\par\weekdays{\n}}
\end{document}

Bildbeschreibung hier eingeben

Auf diese Weise wird die Erweiterung des Arguments bis nach der Kleinschreibung verzögert. Wenn die Kleinschreibung abgeschlossen ist, \IfSubStrwerden -Direktiven ausgeführt. \IfSubStrerweitert das Argument ebenfalls vollständig.
Aber bei der Kleinschreibung eines Arguments, dessen Erweiterung während der Kleinschreibung verhindert wird, kann die Übergabe \csname..\endcsnamevon -Ausdrücken, deren Erweiterung irgendwann Ziffernfolgen ergibt, ein Problem darstellen, da die Kleinschreibung ändern könnte, was zwischen \csnameund steht \endcsnameund somit ändern könnte, welches Steuersequenz-Token aus dem \csname...\endcsname-Ausdruck gebildet wird.

daherdie Lösung von Egregist zu bevorzugen.


Alternativ können Sie nur \noexpanddie Erweiterung des Tokens verhindern \IfSubStr.

\documentclass{article}
\usepackage{stix2}
\usepackage{suffix}
\WithSuffix\newcommand\textsc*[1]{%
    \textsc{\MakeLowercase{#1}}%
}
\usepackage{tikz}
\newcommand{\Repeat}[2]{%\repeat already used
    \foreach \n in {1,...,#1}{#2}%
}
\usepackage{xstring}
\DeclareRobustCommand{\weekdays}[1]{%
   \textsc*{%
       \noexpand\IfSubStr{#1}{1}{N}{}%Sunday
       \noexpand\IfSubStr{#1}{2}{M}{}%Monday
       \noexpand\IfSubStr{#1}{3}{T}{}%Tuesday
       \noexpand\IfSubStr{#1}{4}{W}{}%Wednesday
       \noexpand\IfSubStr{#1}{5}{R}{}%Thursday
       \noexpand\IfSubStr{#1}{6}{F}{}%Friday
       \noexpand\IfSubStr{#1}{7}{S}{}%Saturday
   }%
}
\begin{document}
\weekdays{246}\quad\weekdays{35}
\Repeat{7}{\par\weekdays{\n}}
\par
\def\foobar{1357}
\weekdays{\foobar}
\end{document}

Bildbeschreibung hier eingeben

Allerdings wird die Kleinschreibung des Arguments nicht verhindert, was bei benutzerdefinierten \lccodeEinstellungen zu unerwarteten Ergebnissen führen kann.

verwandte Informationen