我需要编写\setToOldWidth
对字符串、计数器和长度进行操作的命令。
不幸的是,下面的命令在文本中输入了许多空格,不知道为什么,可能是由于字符串操作。如何让它完全静音,但仍然正确设置长度值?
我不能使用 xstring,因为它与我很旧的课程中的其他内容发生冲突。
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{stringstrings}
\usepackage{ifthen}
\newcounter{getOldWidthExtendedSettingsPos}
\newcounter{getOldWidthOldWidthPos}
\newcounter{getOldWidthOldOptionLength}
\newcommand{\setToOldWidth}[2]{%
\whereisword[q]{#2}{Extended~Settings}%
\setcounter{getOldWidthExtendedSettingsPos}{\theresult}%
%
\whereisword[q]{#2}{Old~Width=}%
\setcounter{getOldWidthOldWidthPos}{\theresult}%
%
\stringlength[q]{#2}%
\setcounter{getOldWidthOldOptionLength}{\theresult}%
%
\ifnum\thegetOldWidthExtendedSettingsPos>0%
\ifnum\thegetOldWidthOldWidthPos>0%
\addtocounter{getOldWidthOldWidthPos}{10}%
\substring[e]{#2}{\thegetOldWidthOldWidthPos}{\thegetOldWidthOldOptionLength}%
\settowidth{#1}{\thestring}%
\else%
\settowidth{#1}{#2}%
\fi%
\else%
\settowidth{#1}{#2}%
\fi%
}
\begin{document}
\newlength{\testwidth}
Test\setToOldWidth{\testwidth}{Extended Settings,Picture Width=120mm,Old Width=AXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXZ}next part
\end{document}
答案1
不需要的空间位于stringstrings
:
940 \else
941 \if \thestring#3\global\matchingchartrue\else\global\matchingcharfalse\fi
942 \fi}
943 \?}
第 942 行的结束线不受保护。
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{stringstrings}
\usepackage{ifthen}
\usepackage{xpatch}
\xpatchcmd{\testmatchingchar}{ \?}{\?}{}{}
修复了该问题。报告此问题。
但是你应该删除%
行末的
\ifnum\thegetOldWidthExtendedSettingsPos>0
\ifnum\thegetOldWidthOldWidthPos>0
这些%
将导致后续代币的不合时宜扩张,特别是第一个代币。
我如何找到流氓空间?
我\tracingmacros=1 \tracingcommands=1
在宏调用之前添加了并编译。然后我在日志文件中查找blank space
并找到了几个
\matchingcharfalse ->\let \ifmatchingchar \iffalse
{end-group character }}
{horizontal mode: blank space }
所以我查看了stringstring.sty
,\matchingcharfalse
它只出现在 的替换文本中\testmatchingchar
。发现未受保护的结束行很容易。