用于格式化文本的宏

用于格式化文本的宏

早上好,我有以下问题,我有一个包含 8000 个问题的文件,格式如下:

COD: 7
¿A qué número de revoluciones se alcanza la potencia máxima de un motor?
A Al número de revoluciones a las que gira el motor en el momento de arrancarlo.
B A bajas revoluciones.
C A un número intermedio de revoluciones.
D A un número de revoluciones próximo al máximo.
RESPUESTA: D
NORMA: Sin referencia

并希望保留以下格式:

\begin{description}
 \item[COD: 7] ¿A qué número de revoluciones se alcanza la potencia máxima de un motor?
 \begin{enumerate}
 \item  Al número de revoluciones a las que gira el motor en el momento de arrancarlo.
 \item  A bajas revoluciones.
 \item \textbf{A un número intermedio de revoluciones.}
 \item A un número de revoluciones próximo al máximo.
RESPUESTA: D
NORMA: Sin referencia  
 \end{enumerate}
\end{description}

能否建议我使用任何宏或其他方法来更快地完成它?

在此先感谢您的帮助。

答案1

一个简单的半手动解决方案可以在行首搜索并替换固定字符串为“COD:”,以使这些字符串适应 LaTeX 转换器/生成器可以理解的内容。

第二步有几种工具,而第一步可能有数百种工具,因此,我将仅介绍我在 Linux 中知道的一种方法,但只要稍加想象力,就可以通过多种方式适应其他工具和操作系统。

第一步:查找并替换“COD:”,“\nA”,“\nB”等,gedit或任何其他工具,但最好使用可以找到行尾(\n)和制表符(\n)的工具,以使文本具有以下格式:

* COD: 7
¿A qué número de revoluciones se alcanza la potencia máxima de un motor?
^^ Al número de revoluciones a las que gira el motor en el momento de arrancarlo.
++ A bajas revoluciones.
++ A un número intermedio de revoluciones.
++ A un número de revoluciones próximo al máximo.
N:RESPUESTA: D
N:NORMA: Sin referencia

第二步:使用 SDF 转换为 LaTeX(至少在 Debian 和 Ubuntu 发行版的官方软件包中可用)。

$ sdf +sdf2latex_ yourfile.txt

输出是yourlife.tex但没有前言和文档类,因此您必须至少包含:

\documentclass[spanish]{article}
\usepackage{babel}
\usepackage[utf8]{inputenc} % problems? try latin9 

原始输出是:

%%% This file was generated using SDF $version by
%%% Ian Clatworthy ([email protected]) and the 2latex_ driver
%%% $Id: tolatex.pl,v 1.1.1.2 1998/03/22 09:39:20 valerio Exp valerio $
%%% written by Valerio Aimale <[email protected]>.
%%% SDF is freely available from http://www.mincom.com/mtr/sdf

\begin{document}

\begin{itemize} % Level 1
\item COD: 7 ¿A qué número de
revoluciones se alcanza la potencia máxima de un motor?

\begin{enumerate} % Level 2
\item Al número de revoluciones a las que
gira el motor en el momento de arrancarlo.

\item A bajas revoluciones.

\item A un número intermedio de revoluciones.

\item A un número de revoluciones próximo al máximo.

\end{enumerate}
\end{itemize}

RESPUESTA: D


NORMA: Sin referencia


\end{document}

添加前言后,编译后可得到以下结果:

平均能量损失

这与您的示例不完全相同,因为没有description环境但是itemize。据我所知,SDF 仅管理无序或编号列表,但更改这是在所有文档中进行的简单搜索和替换。

手册部分可以用“COD:7”括起来[ ] ,并用粗体字体标记正确答案,但要使用带有宏语言的编辑器,因为Nedit它可以在五个步骤中轻松实现自动化。如果你没有好的编辑器,请参阅这种比较

答案2

是的,这是脚本或小程序的工作,而不是 TeX 的工作。您可以使用多种工具来完成此操作:小型 shell 脚本、解析器生成器或像我这样做的小程序。

我选择 Java 作为编程语言。我假设您的每个问题都有 8 行。我只是从名为 questions.txt 的文件中读取它们,解析它们并编写一些 TeX 代码(questions.tex 和 questionsBody.tex)。

import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class test {

/**
 *  Name of the main output file
 */
private final static String FILE_NAME = "questions.tex";

/**
 *  Name of the body file which is included into the main output file
 */
private final static String FILE_NAME_BODY = "questionsBody.tex";

/**
 *  Name of the input file
 */
private final static String INPUT_FILE_NAME = "questions.txt";

/**
 * The main output file where the generated latex code will be written into.
 */
private static File outputFileBody;

/**
 * 
 */
private static BufferedWriter outputStreamBody;

/**
 * reads the input file line by line and converts them to tex code
 */
private static void convertDoc(File inFile) throws IOException {
    BufferedReader inputStreamR = new BufferedReader(new FileReader(inFile));
    String buf;
    String[] buf2 = new String[8];
    while ((buf = inputStreamR.readLine()) != null) {
        // read 8 lines
        buf2[0] = buf;
        buf2[1] = inputStreamR.readLine();
        buf2[2] = inputStreamR.readLine();
        buf2[3] = inputStreamR.readLine();
        buf2[4] = inputStreamR.readLine();
        buf2[5] = inputStreamR.readLine();
        buf2[6] = inputStreamR.readLine();
        buf2[7] = inputStreamR.readLine();
        convertLine(buf2);
        System.out.print(".");
    }
}

/**
 * convert a single question to TeX code and write them to the output stream
*/
private static void convertLine(String[] buf2) throws IOException {
    outputStreamBody.write("\\begin{description}\n");
    outputStreamBody.write("\\item["+buf2[0]+"] "+buf2[1]+"\n");
    outputStreamBody.write("\\begin{enumerate}\n");
    outputStreamBody.write("\\item "+buf2[2].substring(2)+"\n");
    outputStreamBody.write("\\item "+buf2[3].substring(2)+"\n");
    outputStreamBody.write("\\item \\textbf{"+buf2[4].substring(2)+"}\n");
    outputStreamBody.write("\\item "+buf2[5].substring(2)+".\n");
    outputStreamBody.write(buf2[6]+"\n");
    outputStreamBody.write(buf2[7]+"\n");
    outputStreamBody.write("\\end{enumerate}\n");
    outputStreamBody.write("\\end{description}\n\n");
}

/**
 * the main function
 * @param args
 */
public static void main (String[] args)
{
    System.out.println ("Start converting\n");
    String userDir = System.getProperty("user.dir") + File.separator;
    initOutputFiles(userDir);

    File inFile = new File (userDir+INPUT_FILE_NAME);
    if(inFile!=null) {
        try {
            convertDoc(inFile);
            outputStreamBody.flush ();
            outputStreamBody.close ();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    System.out.println ("\nFinished");
    System.exit (0);
}


private static void initOutputFiles (String path) {
    try
    {
        outputFileBody = new File(path + FILE_NAME_BODY);
        outputStreamBody = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFileBody), "UTF8"));
        System.out.println ("write output to: "+outputFileBody);
        writeMainFile(path);
    }
    catch (UnsupportedEncodingException e)
    {
        e.printStackTrace();
    }
    catch (FileNotFoundException e)
    {
        e.printStackTrace();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
}


private static void writeMainFile (String path) throws UnsupportedEncodingException, FileNotFoundException, IOException {
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(path + FILE_NAME)), "UTF8"));

    // write tex file
    writer.write("\\documentclass[a4paper,12pt]{article}"); writer.newLine();
    writer.write("\\usepackage[utf8x]{inputenc}");  writer.newLine();
    writer.write("\\usepackage[T1]{fontenc}"); writer.newLine();
    writer.write("\\usepackage[left=10mm,right=10mm,top=10mm,bottom=0mm]{geometry}"); writer.newLine();
    writer.write("\\setlength{\\parindent}{0ex}");  writer.newLine();
    writer.newLine();
    writer.write("\\begin{document}"); 
    writer.newLine(); writer.newLine();
    writer.write("\\include{"+FILE_NAME_BODY.substring (0, FILE_NAME_BODY.indexOf ('.'))+"}"); 
    writer.newLine(); writer.newLine();
    writer.write("\\end{document}"); writer.newLine();
    writer.flush();
    writer.close();
}

}

这只是快速而肮脏的代码,有几次失败的机会,但对于一个小例子来说它对我来说是有效的。

如果要使用它,首先需要将代码中输入文件的名称改为文件的名称(变量FILE_NAME)。之后你需要编译程序(javac 测试.java)并运行它(Java 测试)。

祝你好运

相关内容