2013-12-11 2 views
3

나는 \ mathrm {}에 묶인 수학 표현식이 많은 라텍스 코드를 가지고 있습니다. 선호하는 emacs를 사용하여 표현식 주위에 \ mathrm {} 코드를 제거하고 싶습니다. 예를 들어, 내가이맥스에서 괄호로 표현식을 검색/바꾸는 방법은 무엇입니까?

\gamma \cdot x_0 

\의 mathrm 제거와

\mathrm{\gamma \cdot x_0} 

을 대체하고 싶습니다 {에만 간단하지만 나는 또한 닫는 브래킷을 제거해야합니다. 이맥에서 어떻게하면 되나요?

많은 감사,

Enno

답변

7

당신은이 문제를 해결하기 위해 다시 참조를 사용할 수 있습니다. 첫 번째 프롬프트에서

M-Xquery-replace-regexp

를 입력 \\mathrm{\([\a-z0-9_ ]+\)}, \1 두 번째 프롬프트에서 실행합니다.

query-replace-regexp의 기본 키 바인딩은 C-M- %입니다.

\1은 첫 번째 괄호로 묶은 그룹 \([\a-z0-9_ ]+\)에 대한 역 참조이며 바꾸려면 정규 표현식을 사용하십시오. 이 그룹은 중괄호 사이의 내용을 대상으로합니다. 그래서 여러분이 말하는 것은 여러분이 대체 할 정규 표현식의 어떤 경우라도 그 내용만을 유지하고자하는 것입니다. 정규 표현식 교체에


더 많은 정보는 here 또는 이맥스 설명서의 해당 info 노드를 찾을 수 있습니다.

+3

doSomethingUseless(x+somethingUseful(y)) 

, 당신은 (\ {'선호 할 수처럼 호출합니다. * ? \)}'중괄호와 내용을 일치시킬 수 있습니다. 내용이 무엇인지 구체적으로 설명 할 필요는 없습니다. '*?'는 비 욕심 많은'*'버전입니다. – phils

+0

'\ mathrm'은 로마자로 측정 단위를 설정하는 데 사용됩니다 (예 : 표준). 어떤 이유로 든 이것을 보통 글꼴로 변경해야합니다. 속도 단위는'\ frac {m} {s} '입니다. 그러나 거기에는 이미 \ mathrm {\ frac {m} {s}} 인수 안에 중괄호가 있습니다. 당신의 정규 표현식은 위험한'\ mathrm {\ frac {m}'과 일치 할 것입니다. 따라서, 나는 마지막 그룹으로'\ mathrm' 뒤에있는 전체 sexp를 포착하는 아래의 대답을 선호한다. – Tobias

2

명령 query-replace-regexp은 매우 유연합니다. 자신의 검색 기능에 replace-re-search-function을 설정할 수 있습니다. 다음 lisp 코드는 정규식을 검색하지만 후행하는 sexp를 일치 항목에 포함하는 새 명령 query-replace-re+sexp을 정의합니다.

아래의 defun을 평가 한 후에는 M-x query-replace-re+sexp을 쿼리 대체 기능으로 사용할 수 있습니다. 귀하의 예에서는 "from"문자열 \\\\mathrm과 "replace-with"-string \\1으로 입력하십시오. 여기서 표현식 \\1은 후행 sexp (구분 기호 제외)에서 오는 추가 하위 표현식을 나타냅니다.

(defun re+sexp-search-forward (regexp bound noerror) 
    "Search forward for REGEXP (like `re-search-forward') 
but with appended sexp." 
    (when (re-search-forward regexp bound noerror) 
    (let ((md (match-data)) 
     bsub esub) 
     (setq bsub (1+ (scan-sexps (goto-char (scan-sexps (point) 1)) -1)) 
     esub (1- (point))) 
     (setcar (cdr md) (set-marker (make-marker) (point))) 
     (setq md (append md (list (set-marker (make-marker) bsub) 
       (set-marker (make-marker) esub)))) 
     (set-match-data md) 
     (point)))) 

(defun query-replace-re+sexp() 
    "Like `query-replace-regexp' but at each match it includes the trailing sexps 
into the match as an additional subexpression (the last one)." 
    (interactive) 
    (let ((replace-re-search-function 're+sexp-search-forward)) (call-interactively 'query-replace-regexp))) 

이것은 아주 좋은 기능입니다. 뿐만 아니라 라텍스 교체

\frac{\gamma}{x_0} 

뿐만 아니라 프로그램 텍스트의 교체에 함께

\mathrm{\frac{\gamma}{x_0}} 

처럼 구축합니다.예를 들어 함수의 교체는 일치하고있는 것을 내부에 중첩 된 다른 중괄호가있을 수 없습니다 제공

x+somethingUseful(y) 
관련 문제