mudança de fonte xstring

mudança de fonte xstring

Questão simples. Tenho duas macros para exibir dias da semana abreviados, como MWF ou TR. Não sei por que a primeira macro no meu MWE falha enquanto a segunda macro funciona. Eu preferiria que algo como a primeira macro funcionasse porque é mais curta.

\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}

Responder1

Não sei por que complicar as coisas \MakeLowercasequando você pode apenas usar letras minúsculas na definição.

De qualquer forma, xstringos comandos não são expansíveis e esse é o problema que você tem.

Pode ser resolvido com xstring, mas há uma maneira muito melhor.

\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}

eu não usaria suffix.

insira a descrição da imagem aqui

Responder2

Com \textsc* \MakeLowercaseinternamente faz expansão total via \protected@edefwhile \IfSubStrnão é expansível.
Você pode usar \unexpandedpara impedir a expansão.

\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}

insira a descrição da imagem aqui

Dessa forma, a expansão do argumento é adiada até depois de letras minúsculas. Quando o uso de letras minúsculas é feito, \IfSubStras diretivas são executadas. \IfSubStrtambém expande totalmente o argumento.
Mas com letras minúsculas em um argumento, cuja expansão é evitada durante letras minúsculas, passar \csname..\endcsnameexpressões cuja expansão em algum estágio produz sequências de dígitos pode ser um problema porque letras minúsculas podem alterar o que está entre \csnamee \endcsname, portanto, pode alterar qual token de sequência de controle é formado a partir da \csname...\endcsnameexpressão - .

Portantoa solução de egregé preferir.


Alternativamente, você pode usar apenas \noexpandpara impedir a expansão do token \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}

insira a descrição da imagem aqui

Ainda não é possível colocar o argumento em letras minúsculas, o que com \lccodeconfigurações personalizadas pode levar a resultados inesperados.

informação relacionada