2008-09-18 71 views
9

Tôi đang tìm cách để thực hiện chuỗi con thay thế trên một chuỗi trong LaTeX. Những gì tôi muốn làm là xây dựng một lệnh mà tôi có thể gọi như thế này:Thay thế một ký tự bằng một chuỗi trong LaTeX

\replace{File,New} 

và đó sẽ tạo ra một cái gì đó giống như

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

Đây là một ví dụ đơn giản, nhưng tôi muốn có thể đặt định dạng/cấu trúc trong một lệnh duy nhất thay vì ở mọi nơi trong tài liệu. Tôi biết rằng tôi có thể xây dựng một số lệnh để tăng số lượng tham số, nhưng tôi hy vọng rằng có một cách dễ dàng hơn.

Chỉnh sửa để làm rõ

Tôi đang tìm kiếm một tương đương với

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

cái gì mà có thể mất một chuỗi tùy ý, và thay thế một chuỗi với chuỗi khác.

Vì vậy, tôi có thể gọi lệnh bằng \ replace {File}, \ replace {File, New}, \ replace {Tệp, Tùy chọn, Người dùng}, v.v., bọc các từ có định dạng đậm và thay thế bất kỳ dấu phẩy nào bằng lệnh mũi tên bên phải. Ngay cả khi bit "gói với in đậm" quá khó (như tôi nghĩ nó có thể), chỉ cần phần thay thế sẽ hữu ích.

Trả lời

6

Các trường hợp chung là khá phức tạp hơn (khi bạn không sử dụng dấu phẩy như dải phân cách), nhưng ví dụ bạn đưa ra có thể được mã hóa mà không có quá nhiều rắc rối với một số kiến ​​thức về nội bộ LaTeX.

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

Tôi đã bình chọn điều này - nó tốt hơn tôi, mà chỉ có công đức thực sự là nó là tinh khiết LaTeX –

+0

Điều này làm việc tuyệt vời, cảm ơn! –

-1

OK, tôi rút câu trả lời này. Cảm ơn bạn đã làm rõ câu hỏi.


Tôi nghi ngờ điều này có thể không được những gì bạn muốn, nhưng ở đây đi anyway:

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

Nếu đây không phải là những gì bạn đang tìm kiếm, bạn có thể làm rõ câu hỏi, xin vui lòng?

2

Có gói LaTeX có tên là tokenizer có thể giúp bạn thực hiện những gì bạn muốn.

Đây là một hack (nhưng tinh khiết LaTeX, không có nội bộ) mà được gần với những gì tôi nghĩ rằng bạn muốn, nhưng với một số không gian không liên quan tôi đã không hoàn toàn có thể sửa chữa. Có lẽ Will Robertson có thể tư vấn thêm? Không giống như câu trả lời hơi bóng bảy hơn mình, tôi đã không parameterised các bit và miếng, đây đi:

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

Hmmm . Tôi đã không sử dụng gói tokenizer trước đây; có vẻ như vấn đề "khoảng trống" của bạn là do lỗi trong gói đó. Nếu bạn bao quanh macro "\ GetTokens" với dấu phẩy, thì bạn sẽ thấy rằng khoảng trống thừa được chèn bởi macro đó. Do đó, không phải lỗi của bạn :) –

+0

Vâng, tôi đã từng là như vậy. Tôi đã thử thêm một số ngẫu nhiên '%' tại eol trong vĩ mô, nhưng vô ích. –

2

Thử xstring package:

\usepackage{xstring} 

[…] 

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

Liên kết bị hỏng, hãy thử http://www.ctan.org/pkg/xstring –

4

có vẻ như "không gian" Vấn đề của bạn là từ một lỗi trong gói đó. Nếu bạn bao quanh macro "\ GetTokens" với dấu phẩy, thì bạn sẽ thấy rằng khoảng trống thừa được chèn bởi macro đó.

Có lỗi trong gói bộ kiểm lỗi.Như tôi đã nói trên blog tôi, bugfix là sử dụng mã sửa sau thay vì chỉ "\ usepackage [cắt] {tokenizer}":

\usepackage[trim]{tokenizer} 

\def\[email protected]#1,#2\@empty{% 
    \def\[email protected]{#1}% 
    \ifx\[email protected]\[email protected]% strip spaces if requested 
     \TrimSpaces\[email protected]% 
    \fi% 
    \[email protected]{\[email protected]}{\[email protected]}% 
    \[email protected]{\[email protected]}{#2}% 
    } 
\def\[email protected]#1,#2\@empty{% 
    \def\[email protected]{#2}% 
    \ifx\[email protected]\@empty% 
     \edef\[email protected]{\[email protected]}% 
    \else% 
     \edef\[email protected]{\[email protected]}% 
    \fi% 
    } 

tôi sẽ báo cáo bugfix này để các nhà phát triển Sascha Herpers

Các vấn đề liên quan