我正在使用变量以这种方式创建字符串
\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}