简单的解决方案

简单的解决方案

我正在使用变量以这种方式创建字符串

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

这很有效。现在,我可以访问此字符串(长度为 10)的每一个字符,因为在文档的其他部分,我只想获取它的前四个字母(“2014”)来创建新的内容。

答案1

简单的解决方案

这可以通过包来实现xstring。具体来说,命令允许您从\StrMid{string}{#2}{#3}字符位置到 取出字符串的子字符串。#2#3

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

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

允许\myText{}

然而,上述解决方案始终需要的参数\myText

看起来您想\myText{}提供整个字符串2014/12/20。因此,我们可以将第一个参数设为可选(如果括号中未给出,则默认为第一个位置),第二个参数为第二个位置。我们设置了一个条件,这样如果第二个位置为空,我们就会获取整个字符串。

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

答案2

stringstrings包裹。

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

在此处输入图片描述


listofitems包替代,这里设置根据/分隔符来解析输入字符串。

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

在此处输入图片描述

答案3

基于 LuaLaTeX 的解决方案,它设置了一个名为的 TeX 宏,\substring该宏带有三个参数。

宏的第一个参数\substring是字符串。它可以是硬编码字符串,也可以是生成字符串的 TeX 宏。例如,如果 \myText是通过 定义的\newcommand{\myText}{2014/12/20},则\myText可以用作 的第一个参数\substring

第二和第三个参数是子字符串的起始和结束索引,并假定为整数。如果此假设无效,请指出。

在此处输入图片描述

% !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}

相关内容