LaTeX 코드를 최소한의 HTML로 변환하려면 어떻게 해야 합니까?

LaTeX 코드를 최소한의 HTML로 변환하려면 어떻게 해야 합니까?

저는 MikTex 배포판의 Texmaker를 사용하고 있습니다.

내가 하고 싶은 일은,

  • 라텍스 코드 생성
  • Texmaker를 실행하여 모든 대체 작업을 수행합니다.\newcommand
  • PDF가 아닌 순수한 ASCII 코드로 빌드하십시오.

질문: 가능하다면 어떻게 수행하고 Texmaker를 구성하는 방법은 무엇입니까?

귀하의 의견을 바탕으로 한 제안: 연대순으로:

  • 사용하거나 결합하여pdftotext

  • tex4ebook와 함께 사용DOM-filters

  • lwarp패키지를 사용하세요

  • 사용pandoc

  • 사용markup

나의 예비 평가다음 제안 중:

  1. pdftotext물론 작동하며 epub 파일을 100%(또는 부분적으로) 수동으로 다시 실행해야 하는 경우 대체 솔루션으로 유용할 수 있습니다. Sigil아래 흐름을 참조하세요. 제외된 lwarp,pandocmarkup 평가에서 제외 됩니다 .

  2. tex4ebooka) michal.h21에서 제안한 대로 구성 파일을 사용하여 실행하고, b) Scrivener사전에 일부 대체 항목을 도입하는 데 사용하여(예: 수행된 작업을 미리 설정하여) 내 목표를 달성할 수 있다고 확신합니다.\index{} c) Sigil마법을 사용합니다(재포맷). , 목차, 메타데이터 등). // 예, 반자동 프로세스로 유지됩니다.

  3. 2a)만 사용하면 생성된 epub 파일이 Calibre의 eBook 리더(소프트웨어)에서는 정상적으로 작동하는 것처럼 보이지만 내 iPad(하드웨어)에서는 이상한 동작이 발생합니다. 자세히 살펴보진 않았지만 아마도<guide> 내부 섹션에 content.opf어떤 이유로 인해 일부 정보가 누락되었을 수 있습니다. Sth. 그렇게. // 최소 코딩 전략을 따르는 또 다른 이유입니다. 즉, 출력에서 ​​가능한 많은 멋진 내용을 피하는 것입니다.

  4. make4ht동일한 구성 파일을 사용 하고 해당 HTML 파일을 처리합니다.Sigil 하고 새 epub에서 해당 HTML 파일을 처리하면 내 iPad에서도 제대로 작동하는 것 같습니다.

프로세스를 염두에 두고: 귀하의 의견에서 다음을 찾으십시오.기본 프로세스아래에 염두에 두었습니다. 내가 그것을 깨달을 수 있을지, 반복될 때 얼마나 신뢰할 수 있을지는 현재로서는 확실하지 않습니다. pdf 부분은 신뢰할 수 있지만 epub 생성은 다음과 같은 결과를 가져올 수 있습니다.깨지기 쉬운 epub 코드(일부 독자에서는 작동하지만 다른 독자에서는 작동하지 않습니다). // 접근 방식: 단일 소스, 일단 고정되면 pdf 및 epub 출력. //물론 단순화되었습니다. // epub은 유효한 epub 콘텐츠일 수 없습니다.문제를 피하기 위해모든 eBook 리더에서. // "최소한의 epub"는 출력 파일에 멋진 내용을 포함하지 않는다는 의미입니다. //허용되는 HTML 주석일 수 있지만 운이 좋지 않으면 일부 eBook 리더를 짜증나게 합니다(로드하는 데 시간이 오래 걸립니다). //장식- 태그 는 내가 기억하는 것이 맞다면 <p> </p>에 의해 수행됩니다 . Sigil파티셔닝, TOC 생성, 스타일시트 등도 마찬가지입니다. 즉, pdflatex제공되는 많은 기능이 다소 중복됩니다.

단일 고정 소스, pdf 및 epub(모든 eBook 리더에서 실행)에서 파생됩니다.

간단히 말해서 덜 유용한 바이트를 제거하고 클래스, div 태그 등을 삽입하기 위해 더 많은 제어권을 가져야 합니다. 저를 믿으십시오. Scrivener필요한 경우 를 사용하여 부분적으로 쉽게 수행할 수 있습니다. (이 프로그램을 모른다면 다양한 길이의 거대한 노트 세트를 생성, 정리, 수정 및 수집하는 도구를 생각해 보세요.)

문제는 프로그램/도구가 epub 파일에 너무 많은 것을 넣는 경향이 있다는 것입니다. 이것은 매우 약한 형식입니다(한 리더에서는 빠르고 잘 작동하지만 다른 리더에서는 문제를 일으킵니다).

여기에 이미지 설명을 입력하세요

예(현재는 거의 사용되지 않음): 불행하게도 내 "ASCII" 요구 사항이 무엇을 의미할지, 의미하지 않을지에 대해 약간의 혼란을 줄 수 있는 여지를 남겼습니다.독자들이 더 이상 'ascii' 또는 'pdf'를 실행하지 않기를 바랍니다.이 간단한 Latex 문서부터 시작해서...

\documentclass[10pt]{book}

\begin{document}

\chapter{Lorem ipsum}

  Dolor sit amet consectetuer eros sit quis mauris pretium. Phasellus penatibus interdum dolor Ut nisl.

  \section{Nam amet}%<<<

  Adipiscing est leo convallis nunc interdum Lorem hendrerit Vestibulum amet.%<<<

  Facilisi Nulla ultrices malesuada orci nibh eget ac Aliquam eros ut. 

  \section{Lorem gravida}

  Oorci sociis Nunc id hendrerit at ac amet Pellentesque. Eleifend risus orci sem Sed ac.

  A nec pellentesque Pellentesque Morbi fringilla accumsan et metus at enim. 

  Eu felis Curabitur quis nibh tellus.

\end{document}

...표시된 부분이 ...로 바뀌면 괜찮을 것 같습니다.

  <h3 class='myOne'>1.1 Nam amet</h3>
<p>Adipiscing est leo convallis nunc interdum Lorem hendrerit Vestibulum amet.
</p>

...하지만 확실히는 아닙니다 ...

  <h3 class='sectionHead'><span class='titlemark'>1.1   </span> <a id='x2-20001.1'></a>Nam amet</h3>
<!-- l. 12 --><p class='noindent'>Adipiscing est leo convallis nunc interdum Lorem hendrerit Vestibulum amet.
</p>

ASCII 편집기에서 PDF 파일을 표시할 때 볼 수 있는 다른 내용은 여기서는 원하지 않습니다.

배경 1(현재는 거의 사용되지 않음): 이는 가능한 한 순수하고 최소한의 HTML을 생성하려는 대안적인 시도입니다. 나는 tex4ebook훌륭한 도구인 를 시도했지만 불행히도 모든 종류의 추가 정보와 스타일을 포함하여 깔끔한 옵션을 사용하더라도 내가 원하지 않는 라텍스 모양을 모방했습니다. (아마도 제거할 수 있는 옵션이 누락된 것 같습니다.)

나는 두 단계의 과정을 생각합니다.

  • 위에 주어진 ASCII 생성
  • 일부 Perl 스크립트를 실행하여 남은 문제 해결

Latex/Texmaker의 확장 기능은 좋을 것입니다. 예를 들어 약어를 확장하고(를 통해 \newcommand) HTML을 사용하거나 필요한 방식으로 참조를 확장 \ref\vref수 있습니다. PDF를 만들고 거기에서 관련 텍스트를 복사하는 것(예: HTML 태그로 "손상된" 일반 텍스트)을 사용하여 어느 정도 이 작업을 수행할 수 있지만 이는 좋은 솔루션이 아닙니다.

목록 환경 등의 추출 및 변환과 같은 문제가 남아 있습니다. 그러나 이것은 이 목적을 위해 만들어진 Perl을 사용하면 가능합니다.

배경 2 (현재는 거의 사용되지 않음)Sigil: 목표는 단 하나의 큰 HTML 파일을 만드는 것입니다. 이 파일은 필요에 따라 모든 epub 관련 내용을 처리하는 에서 분할할 수 있습니다 .

배경 3(현재는 거의 사용되지 않음)Scrivener: 저는 관련 Latex 코드만 삽입하고 Texmaker에 일반 텍스트로 컴파일하여 작성 도구인 를 사용하여 Latex 문서를 만듭니다 . 이를 통해 항목을 포함하거나 제외하거나 수정할 항목을 완전하고 쉽게 제어할 수 있습니다.

스크린샷, 에서 열린 페이지 표시 Sigil, 필요하지 않은 추가 정보 및 삽입해야 하는 누락된 태그(예: 내 Perl 스크립트를 통해)를 보여줍니다. 오른쪽 상단: tex4ebook처리 중. // epub 파일에 너무 많은 출력이 생성되는 간단한 예입니다. 적은 것이 더 많거나 적습니다.

여기에 이미지 설명을 입력하세요

답변1

솔직히, 나는 당신이 달성하고 싶은 것이 너무 유용하다고 생각하지 않습니다. 추가 HTML 태그와 속성은 CSS 스타일링 등에 사용할 수 있는 유용한 의미 정보를 전달합니다.

예를 들어 다음 코드는 다음과 같습니다.

<h3 class='sectionHead'><span class='titlemark'>1.1   </span> <a id='x2-20001.1'></a>Nam amet</h3>
<!-- l. 12 --><p class='noindent'>Adipiscing est leo convallis nunc interdum Lorem hendrerit Vestibulum amet.
</p>

<h3 class='sectionHead'>\section이는 이 제목이 명령 에 의해 생성되었음을 의미하며 <span class='titlemark'>섹션 번호의 특수 형식화에 사용될 수 있습니다. 이 섹션을 가리키는 명령과 TOC의 <a id='x2-20001.1'></a>링크 대상입니다 . \ref이 태그를 제거하면 상호 참조가 작동하지 않습니다. <!-- l. 12 -->는 원본 TeX 파일의 줄 번호입니다. 이는 디버깅에 유용할 수 있지만 다른 태그만큼 유용하지는 않다는 데 동의합니다. <p class='noindent'>이는 이 단락이 원본 문서에서 의도된 것이 아니라는 의미입니다. HTML 파일은 추가 정보에 신경 쓰지 않는 기계에서 사용하기 위한 것이므로 태그를 제거해도 아무 것도 얻지 못하지만 상당히 많은 손실이 발생합니다.

따라서 이 모든 정보를 정말로 제거하고 싶다면 그렇게 할 수 있습니다. 두 가지 가능한 방법이 있습니다. 하나는 TeX4th 구성 파일을 사용하여 생성된 태그를 변경하는 것이고, 다른 하나는 LuaXML DOM 필터를 사용하여 프로그래밍 방식으로 태그를 제거하는 것입니다. 또한 이러한 접근 방식을 혼합하여 더 쉬운 작업을 위해 구성 파일을 사용하고 TeX 측에서 제거하기 어려운 나머지 요소를 제거하기 위해 빌드 파일을 사용할 수도 있습니다.

특정 예는 구성 파일만 사용하여 해결할 수 있습니다. 다음 코드를 다음과 같이 저장합니다 mycfg.cfg.

\Preamble{xhtml}
\def\blocktag#1{\ifvmode\IgnorePar\fi\EndP\HCode{#1}}
\Configure{chapter}{}{}{\blocktag{<h2>}\chaptername\ \TitleMark\HCode{<br />\Hnewline}}{\blocktag{</h2>}}
\Configure{section}{}{}{\blocktag{<h3>}\TitleMark}{\blocktag{</h3>}}
\Configure{subsection}{}{}{\blocktag{<h4>}\TitleMark}{\blocktag{</h4>}}
\Configure{subsubsection}{}{}{\blocktag{<h5>}\TitleMark}{\blocktag{</h5>}}
\ConfigureMark{chapter}{\thechapter}
\ConfigureMark{section}{\thesection\ }
\ConfigureMark{subsection}{\thesubsection\ }
% subsubsection doesn't need mark configuration, as it doesn't produce a number
% handle paragraphs
\Configure{HtmlPar}{\EndP\HCode{<p>}}{\EndP\HCode{<p>}}{\HCode{</p>}}{\HCode{</p>}}
\Configure{textbf}{\HCode{<b>}\NoFonts}{\EndNoFonts\HCode{</b>}}
\Configure{textit}{\HCode{<i>}\NoFonts}{\EndNoFonts\HCode{</i>}}
\Configure{emph}{\HCode{<em>}\NoFonts}{\EndNoFonts\HCode{</em>}}
% handle the <a> tag inside sections

\catcode`\:=11

\def\Title:Link#1#2{}
\def\EndTitle:Link#1{}
% uncomment the following lines to get correct cross-references
%\LinkCommand\SectionLink{span,\noexpand\:gobble,id}
%\def\Title:Link{\SectionLink}
%\def\EndTitle:Link#1{\EndSectionLink}
\catcode`\:=12


\begin{document}
\EndPreamble

섹션 제목을 처리하려면 각 섹션 유형에 대해 두 가지 구성 명령을 제공해야 합니다.

 \Configure{sectionname}{at start of section}{at end of section}{section title}{end section title}
 \ConfigureMark{sectionname}{code that prints section number}

따라서 섹션을 구성하려면 다음을 사용해야 합니다.

\Configure{section}{}{}{\blocktag{<h3>}\TitleMark}{\blocktag{</h3>}}
\ConfigureMark{section}{\thesection\ }

이렇게 하면 TeX4ht에서 생성된 불필요한 서식이 모두 제거됩니다.

그런 다음 단락을 수정할 수 있습니다.

\Configure{HtmlPar}{\EndP\HCode{<p>}}{\EndP\HCode{<p>}}{\HCode{</p>}}{\HCode{</p>}}

줄 번호와 들여쓰기에 대한 정보가 포함된 주석이 제거됩니다. 이 \EndP명령은 이전 단락의 닫는 태그를 삽입합니다.

\textbf또한 다음을 사용하여 유사한 명령 에 대해 더 좋은 형식을 제공했습니다 .

\Configure{textbf}{\HCode{<b>}\NoFonts}{\EndNoFonts\HCode{</b>}}

\NoFonts명령은 등의 삽입을 방지합니다 <span class="cmbex">. 이러한 태그는 기본이 아닌 글꼴을 사용할 때마다 삽입됩니다. \NoFonts그것을 방지할 것입니다. \EndNoFonts다시 켜려면 를 사용해야 합니다 . 글꼴 정보를 전혀 사용하지 않으려면 다음과 같이 명령 NoFonts에 옵션을 추가하여 비활성화할 수 있습니다 \Preamble.

 \Preamble{xhtml,NoFonts}

마지막 부분이 가장 논란의 여지가 있습니다. <a>섹션 제목의 요소는 명령을 사용하여 삽입 됩니다 \Title:Link. 이를 재정의하여 링크를 삭제할 수 있습니다. :이름에 the를 사용하기 때문에 \catcode이 문자도 변경해야 합니다.

\catcode`\:=11
\def\Title:Link#1#2{}
\def\EndTitle:Link#1{}
\catcode`\:=12

이 구성을 사용하면 다음과 같은 결과를 얻을 수 있습니다.

tex4ebook -c mycfg.cfg sample.tex
 <h2>Chapter 1<br /> 
Lorem ipsum</h2>
<p>   Dolor sit amet consectetuer eros sit quis mauris pretium. Phasellus penatibus
interdum dolor Ut nisl.
   </p>
   <h3>1.1 Nam amet</h3>
<p>   Adipiscing est leo convallis nunc interdum Lorem hendrerit Vestibulum
amet.
</p><p>   Facilisi Nulla ultrices malesuada orci nibh eget ac Aliquam eros ut.
</p><p>
   </p>
   <h3>1.2 Lorem gravida</h3>
<p>   Oorci sociis Nunc id hendrerit at ac amet Pellentesque. Eleifend risus orci sem
Sed ac.
</p><p>   A nec pellentesque Pellentesque Morbi fringilla accumsan et metus at
enim.
</p><p>   Eu felis Curabitur quis nibh tellus.
   </p> 

상호 참조와 TOC가 올바르게 작동하도록 하려면 `\Title:Link에 대해 다음 구성을 사용하는 것이 좋습니다.

\LinkCommand\SectionLink{span,\noexpand\:gobble,id}
\def\Title:Link{\SectionLink}
\def\EndTitle:Link#1{\EndSectionLink}

\LinkCommandTeX4ht 상호 참조 메커니즘을 사용하여 링크를 생성하는 새 명령을 정의합니다 . 요소 대신 <a>이 버전은 가능한 출력 링크를 생성하고 제거하며 <span>섹션 을 가리키는 링크의 대상을 보유합니다.\noexpand\:gobbleid

이렇게 변경하면 다음과 같은 결과를 얻게 됩니다.

  <h2 id='lorem-ipsum'>Chapter 1<br /> 
<span id='x2-10001'>Lorem ipsum</span></h2>
<p>   Dolor sit amet consectetuer eros sit quis mauris pretium. Phasellus penatibus
interdum dolor Ut nisl.
   </p>
   <h3 id='nam-amet'>1.1 <span id='x2-20001.1'>Nam amet</span></h3>
<p>   Adipiscing est leo convallis nunc interdum Lorem hendrerit Vestibulum
amet.
</p><p>   Facilisi Nulla ultrices malesuada orci nibh eget ac Aliquam eros ut.
</p><p>
   </p>
   <h3 id='lorem-gravida'>1.2 <span id='x2-30001.2'>Lorem gravida</span></h3>
<p>   Oorci sociis Nunc id hendrerit at ac amet Pellentesque. Eleifend risus orci sem
Sed ac.
</p><p>   A nec pellentesque Pellentesque Morbi fringilla accumsan et metus at
enim.
</p><p>   Eu felis Curabitur quis nibh tellus.
   </p>   

이제 해당 섹션은 다음과 같습니다.

  <h3 id='nam-amet'>1.1 <span id='x2-20001.1'>Nam amet</span></h3>

<span id='x2-20001.1'>Nam amet</span>변경된 구성에 의해 가 추가되었으며, 변경 가능성이 높은 섹션 위치 대신 섹션 제목을 기반으로 안정적인 링크 대상을 제공하기 위해 id='nam-amet'추가되었습니다 .tex4ebook

DVI 파일의 공백에서 생성된 몇 가지 추가 공백 i 단락도 있습니다. 이를 제거하기 위해 DOM 필터를 사용합니다.

이 작업에 대한 간단한 DOM 필터는 다음과 같습니다.

local domfilter = require "make4ht-domfilter"

local function remove_space(node, regex)
  -- remove whitespace only from the text nodes
  if node and node:is_text() then
    node._text = node._text:gsub(regex, "")
  end
end

local filter = domfilter {
  function(dom)
    -- loop over <p> elements
    for _, p in ipairs(dom:query_selector("p")) do
      -- remove <p> elements without text
      local children = p:get_children()
      if #children < 2 and p:get_text():match("^%s*$") then
        p:remove_node()
      else
        local first = children[1]
        local last  = children[#children]
        remove_space(first, "^%s+") -- remove whitespace at the beginning
        remove_space(last, "%s+$") -- remove whitespace at the end of paragraph
      end
    end
    return dom
  end
}

Make:match("html$", filter)

다음 옵션을 사용하여 요구할 수 있습니다 -e.

$ tex4ebook -c mycfg.cfg -e build.lua sample.tex

결과는 다음과 같습니다.

   <h2 id='lorem-ipsum'>Chapter 1<br /> 
<span id='x2-10001'>Lorem ipsum</span></h2>
<p>Dolor sit amet consectetuer eros sit quis mauris pretium. Phasellus penatibus
interdum dolor Ut nisl.</p>
   <h3 id='nam-amet'>1.1 <span id='x2-20001.1'>Nam amet</span></h3>
<p>Adipiscing est leo convallis nunc interdum Lorem hendrerit Vestibulum
amet.</p><p>Facilisi Nulla ultrices malesuada orci nibh eget ac Aliquam eros ut.</p>
   <h3 id='lorem-gravida'>1.2 <span id='x2-30001.2'>Lorem gravida</span></h3>
<p>Oorci sociis Nunc id hendrerit at ac amet Pellentesque. Eleifend risus orci sem
Sed ac.</p><p>A nec pellentesque Pellentesque Morbi fringilla accumsan et metus at
enim.</p><p>Eu felis Curabitur quis nibh tellus.</p>  

관련 정보