早上好,我有以下问题,我有一个包含 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 测试)。
祝你好运