سؤال

أنا أبحث عن وسيلة للقيام فرعية محل على سلسلة في اللاتكس.ما أود القيام به هو بناء الأوامر التي يمكن أن أدعو من هذا القبيل:

\replace{File,New}

والتي من شأنها أن تولد شيئا مثل

\textbf{File}$\rightarrow$\textbf{New}

هذا مثال بسيط ، ولكن أود أن تكون قادرة على وضع تنسيق/هيكل في أمر واحد بدلا من كل مكان في المستند.وأنا أعلم أنني يمكن بناء العديد من الأوامر التي تأخذ زيادة أعداد المعلمات, ولكن أنا على أمل أن هناك طريقة أسهل.

تحرير للتوضيح

أنا أبحث عن ما يعادل

string.replace(",", "$\rightarrow$)

شيء التي يمكن أن تتخذ التعسفي سلسلة استبدال فرعية أخرى فرعية.

لذا أنا يمكن أن نسميه الأمر مع \محل{ملف}, \محل{ملف جديد}, \محل{ملف خيارات المستخدم} ، وما إلى ذلك ، التفاف الكلمات مع الغامق و استبدال أي الفواصل مع السهم الأيمن الأوامر.حتى لو كان "التفاف جريئة" قليلا من الصعب جدا (كما أعتقد أنه قد يكون) فقط استبدال جزء من شأنه أن يكون مفيدا.

هل كانت مفيدة؟

المحلول

الحالة العامة هو أكثر صعبة (عندما كنت لا تستخدم الفواصل فواصل), ولكن المثال الذي أعطيته يمكن أن تكون مشفرة دون الكثير من المتاعب مع بعض المعارف من اللاتكس الداخلية.

\documentclass[12pt]{article}
\makeatletter
\newcommand\formatnice[1]{%
  \let\@formatsep\@formatsepinit
  \@for\@ii:=#1\do{%
    \@formatsep
    \formatentry{\@ii}%
  }%
}
\def\@formatsepinit{\let\@formatsep\formatsep}
\makeatother
\newcommand\formatsep{,}
\newcommand\formatentry[1]{#1}
\begin{document}
\formatnice{abc,def}

\renewcommand\formatsep{\,$\rightarrow$\,}
\renewcommand\formatentry[1]{\textbf{#1}}
\formatnice{abc,def}
\end{document}

نصائح أخرى

يبدو أن "المساحات" المشكلة من الخلل في هذا حزمة.إذا كنت تحيط "\GetTokens" ماكرو مع فواصل ، ثم سترى أن مساحة إضافية يتم إدراجها من قبل هذا الماكرو.

نعم هناك أخطاء في tokenizer الحزمة.كما قلت في بلدي بلوق, ، خلل هو استخدام ما يلي تصحيح التعليمات البرمجية بدلا من مجرد "\usepackage[القطع]{tokenizer}":

\usepackage[trim]{tokenizer}  

\def\SH@GetTokens#1,#2\@empty{%
    \def\SH@token{#1}%
    \ifx\SH@trimtokens\SH@true% strip spaces if requested
        \TrimSpaces\SH@token%
    \fi%
    \SH@DefineCommand{\SH@FirstArgName}{\SH@token}%
    \SH@DefineCommand{\SH@SecondArgName}{#2}%
    }
\def\SH@CheckTokenSep#1,#2\@empty{%
    \def\SH@CTSArgTwo{#2}%
    \ifx\SH@CTSArgTwo\@empty%
        \edef\SH@TokenValid{\SH@false}%
    \else%
        \edef\SH@TokenValid{\SH@true}%
    \fi%
    }

سوف تقرير هذا خلل المطور ساشا Herpers

هناك المطاط حزمة تسمى tokenizer والتي قد تساعدك على أن تفعل ما تريد.

وهنا هاك (لكن النقي المطاط لا الداخلية) التي يقترب ما أعتقد أنك تريد, ولكن مع بعض دخيلة المساحات لم يكن قادرا على إصلاح.ربما سوف روبرتسون يمكن تقديم المشورة ؟ خلافا له أكثر قليلا مصقول الجواب ، لم parameterised القطع ، يذهب هنا:

\usepackage{forloop}  
\usepackage[trim]{tokenizer}  
...  
\newcounter{rrCount}  
\newcommand{\replace}[1]{%  
    \GetTokens{rrFirst}{rrRest}{#1,}%  
    \textbf{\rrFirst}%  
    \forloop{rrCount}{0}{\value{rrCount} < 100}{%  
        \ifthenelse{\equal{\rrRest}{}}{%  
            \setcounter{rrCount}{101}%  
        }{%  
            \GetTokens{rrFirst}{rrRest}{\rrRest}%  
            $\rightarrow$\textbf{\rrFirst}%  
        }%  
    }%  
}%  
% -----------------------------------------------------------------  
\replace{a1}\\  
\replace{a2,b2}\\  
\replace{a3,b3,c3}\\  

حاول xstring حزمة:

\usepackage{xstring}

[…]

\StrSubstitute{File,New}{,}{\(\rightarrow\)}

حسنا, يمكنني سحب هذا الجواب.شكرا على توضيح السؤال.


وأظن أن هذا قد لا يكون ما تريد, ولكن هنا يذهب على أي حال:

\newcommand{\replace}[2]{\textbf{#1}$\rightarrow$\textbf{#2}}  
\replace{File}{New}  

إذا لم يكن هذا ما تبحث عنه, هل يمكنك توضيح السؤال من فضلك ؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top