Latex编辑功能的简陋实现

本文介绍了如何实现一个简单的LaTeX编辑功能,包括修改、删除、插入操作,并讨论了其确认修改的机制,同时提到了工具的特色和存在的缺陷。在实现方式部分,作者可能详细阐述了采用的技术和思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

功能说明

修改操作

\modify {Origin text} {Modification}
效果
Origin text Modification

删除操作

\delete{Delete}
效果
Delete

插入操作

\addtext{Add Something}
效果
Add Something

确认修改(消除编辑标记)

python CommitModify.py path-to-tex-file

特色

支持嵌套式的编辑,如
\modify{\addtext{old text}}{\delete{some words} and more}

缺陷

命令不能跨行,如下为非法命令
\modify{Old Text}
{New Text}

实现方式

在latex文件开头加入如下代码
\usepackage{xcolor}
\usepackage{mathrsfs}
\def\sharedaffiliation{ \end{tabular} \begin{tabular}{c}}
\usepackage{enumerate}
\usepackage[normalem]{ulem} 
\newcommand{\modify}[2]{\sout{#1} \textcolor{red}{#2}}
\newcommand{\addtext}[1]{\textcolor{red}{#1}}
\newcommand{\delete}[1]{\sout{#1}}

编辑确认的python脚本
#! /bin/python

def getBrace(line, index=0):
    '''
    find the index of out brace in a line
    {{{}}},0 -> return (0,5)
    {{{}}},1 -> return (1,4) 
    '''
    si = -1
    ei = -1
    cnt = 0
    while index < len(line):
        if line[index] == '{':
            if cnt == 0:
                si = index
            cnt = cnt + 1
        elif line[index] == '}':
            cnt = cnt - 1;
            if cnt < 0:
                return (-1, -1)
            elif cnt == 0:
                ei = index
                break
        index = index + 1    
    return (si, ei)

def replace_modify(line):
    '''
    replace \modify{arg1}{arg2} commands
    '''
    while True:
        index = line.find('''\modify''')
        if index == -1: break
        s1, e1 = getBrace(line, index)
        if e1 == -1: break
        s2, e2 = getBrace(line, e1+1)
        print line[index:e2+1]
        line = line[0:index] + line[s2+1:e2] + line[e2+1:]
    return line

def replace_delete(line):
    '''
    replace \delete{arg1} commands
    '''
    while True:
        index = line.find('''\delete''')
        if index == -1: break
        s1, e1 = getBrace(line, index)
        if e1 == -1: break
        print line[index:e1+1]
        line = line[0:index] + line[e1+1:]
    return line

def replace_insert(line):
    '''
    replace \addtext{arg1} commands
    '''
    while True:
        index = line.find('''\\addtext''')
        if index == -1: break
        s1, e1 = getBrace(line, index)
        if e1 == -1: break
        print line[index : e1+1]
        line = line[0:index] + line[s1+1:e1] + line[e1+1:]
    return line

if __name__ == '__main__':
    import os, sys
    if len(sys.argv) <= 1:
        print "Usage : CommitModify tex-file-name"
        sys.exit()
    fpath = sys.argv[1]
    
    if not os.path.isfile(fpath):
        print fpath + "Not Found"
        sys.exit()
        
    if not os.path.splitext(fpath)[1] == '.tex':
        print fpath + "Not A Tex File"
        sys.exit()
        
    h = lambda l: replace_modify(replace_delete(replace_insert(l))) 
    f = open(fpath, 'r')
    try:
        buffer = [h(l) for l in f.readlines()]
    finally:
        f.close()
    
    save = raw_input('Do you sure to commit the above modifications? Y/N\n') 
    if not save[0] == 'Y':
    	sys.exit()

    f = open(fpath, 'w')
    try:
        f.write(''.join(buffer))
    finally:
        f.close()

对修改确认功能的单元测试
import unittest
from CommitModify import *

class Test(unittest.TestCase):    
    def testReplaceModify(self):
        self.assertEqual('Modify Sample: Modification',  
        replace_modify('Modify Sample: \modify {Origin text} {Modification}'))
        self.assertEqual('Modify Sample: {}{}',  
        replace_modify('Modify Sample: \modify {{}} {{}{}}'))
        self.assertEqual('t2 t4',  
        replace_modify('\modify {t1} {t2} \modify {t3} {t4}')) 
        self.assertEqual('Modify Sample: Modification',  
        replace_modify('Modify Sample: \modify{Origin text}{Modification}'))
                       
    def testReplaceDelete(self):
        self.assertEqual('Delete Sample: \\',  
        replace_delete('Delete Sample: \delete{Delete}\\'))
        self.assertEqual('Delete Sample: \\',  
        replace_delete('Delete Sample: \delete    {Delete}\\'))
        self.assertEqual('Delete Sample: \\',  
        replace_delete('Delete Sample: \delete{{{{{}}}}{}}\\'))
        self.assertEqual('',  
        replace_delete('\delete{Delete}\delete    {Delete}\delete{{{{{}}}}{}}'))
    
    def testReplaceInsert(self):
        self.assertEqual('Insert Sample: Insert\\',  
        replace_insert('Insert Sample: \\addtext{Insert}\\'))
        self.assertEqual('Insert Sample: Insert\\',  
        replace_insert('Insert Sample: \\addtext    {Insert}\\'))
        self.assertEqual('Insert Sample: {{{{}}}}{}\\',  
        replace_insert('Insert Sample: \\addtext{{{{{}}}}{}}\\'))
        self.assertEqual('InsertInsert{{{{}}}}{}',  
        replace_insert('\\addtext{Insert}\\addtext    {Insert}\\addtext{{{{{}}}}{}}'))

    def testNestedCommands(self):
        case0 = '\modify{\\addtext{\delete{hhee}pp}}{\modify{hehe}{ppp}}'
        self.assertEqual('ppp', 
            replace_modify(replace_delete(replace_insert(case0))))

if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testName']
    unittest.main()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值