Solução Simples

Solução Simples

Estou usando variáveis ​​para criar strings dessa forma

\newcommand{\myText}{2014/12/20}
\myText{}

Isso funciona muito bem. Agora posso acessar cada caractere desta string (o comprimento é 10), pois nas outras seções do meu documento quero obter apenas as primeiras quatro letras ("2014") dele, para criar algo novo.

Responder1

Solução Simples

Isso pode ser feito com o xstringpacote. Em particular, o \StrMid{string}{#2}{#3}comando permite que você pegue a substring da string das posições dos caracteres #2até #3.

\documentclass{article}
\usepackage{xstring}
\newcommand{\myText}[2]{\StrMid{2014/12/20}{#1}{#2}}

\begin{document}
\myText{1}{4}
\end{document}

Permitindo\myText{}

No entanto, a solução acima sempre requer argumentos para \myText.

Parece que você deseja \myText{}fornecer a string inteira 2014/12/20. Portanto, podemos tornar o primeiro parâmetro opcional (o padrão é a primeira posição se não for fornecido entre colchetes) e o segundo parâmetro é a segunda posição. Configuramos uma condicional para que, se a segunda posição estiver vazia, obtenhamos apenas a string inteira.

\documentclass{article}
\usepackage{xstring}
\newcommand{\myText}[2][1]{
    \ifx\\#2\\
        {2014/12/20}
    \else
        \StrMid{2014/12/20}{#1}{#2}
    \fi
}

\begin{document}

\myText{}

\myText[1]{4} \quad
\myText[6]{7} \quad
\myText[9]{10} \quad

\myText{7} \quad
\myText[6]{10}
\end{document}

Responder2

Com o stringstringspacote.

\documentclass{article}
\usepackage{stringstrings}
\begin{document}
\def\x{2014/12/20}
\substring{\x}{1}{4}\par
\substring{\x}{6}{7}\par
\substring{\x}{9}{$}\par% The $ implies the last character of the string.
\end{document}

insira a descrição da imagem aqui


Alternativa ao listofitemspacote, configure aqui para analisar a string de entrada com base em um /separador.

\documentclass{article}
\usepackage{listofitems}
\begin{document}
\def\x{2014/12/20}
\setsepchar[.]{/}
\readlist\mydate{\x}
The year is \mydate[1]\par
The month is \mydate[2]\par
The day is \mydate[3]\par
\end{document}

insira a descrição da imagem aqui

Responder3

Uma solução baseada em LuaLaTeX, que configura uma macro TeX chamada \substringque recebe três argumentos.

O primeiro argumento da macro \substringé uma string. Pode ser uma string codificada ou uma macro TeX que produz uma string. Por exemplo, se \myTextfor definido via \newcommand{\myText}{2014/12/20}, então \myTextpoderá ser usado como o primeiro argumento de \substring.

O segundo e o terceiro argumentos são os índices inicial e final da substring e são considerados inteiros. Indique se esta suposição não é válida.

insira a descrição da imagem aqui

% !TEX TS-program = lualatex
\documentclass{article}
\newcommand\substring[3]{%
    \directlua{ tex.sprint ( string.sub ( "#1", #2, #3 ) ) } }
\begin{document}
\substring{2014/12/20}{1}{4}
\end{document}

informação relacionada