web-dev-qa-db-ja.com

LibreOfficeは「表示」モードのWord方程式を正しく表示しません。できるLinuxワープロはありますか?

Microsoft Wordには、方程式を表示する2つの方法があります。 InlineおよびDisplayインライン方程式は(名前が示すように)テキストと一致しているため、方程式とテキストを混在させることができます。表示方程式は、次のように独自の行に表示され、自動的に中央揃えされます。

enter image description here

これらは3つの独立した方程式ですが、表示モードに設定されているため、すべて中央揃えで独自の線上に表示されます。モードがインラインに変更された場合、それらはすべて同じ行に表示され、代わりに中央に配置されません。

enter image description hereenter image description here

私の問題は、LibreOfficeが、docxファイルでdisplay-modeに設定されている場合でも、インラインモードを使用してすべての方程式を表示することです。表示モードの方程式Wordを使用して最初の例を作成し、保存してからLibreOfficeで開くと、方程式はインラインモードであるかのように表示されます。

enter image description here

Wordのように、表示モードの方程式を独自の行に合わせて中央揃えにするために変更できる設定はありますか?私の持っているWord文書は膨大な量であるため、文書を個別に変更したくない。

そうでない場合、方程式を正しく表示する代替のワープロはありますか?

3

数式がLibreOfficeに挿入されると、デフォルトでAs Characterアンカーされます。

anchor as character

これは、キャラクターと同じように動作することを意味します。したがって、3つの文字がある場合と同じように処理します。たとえば、3つの方程式ではなく「abc」です。

  1. フォーマット->整列->中央
  2. 最初の方程式の後にカーソルを移動し、押します Enter
  3. 2番目の方程式に対して手順2を繰り返します。

現在、3つの方程式はすべて中心にあり、別々の行にあります。

three equations

「abc」の例に対するこれらの命令の結果は、数式が文字と同じように動作することを示しています。 (押す Enter 大文字の「A」に自動修正されます)。

a b c on separate lines

これをMS WordとLibreOfficeの両方で機能させるには、おそらくInline設定のみを使用してください。ただし、これを確認するためのMS Wordのコピーはなく、Word Onlineでは数式を編集できません(ただし、必要な場合は数式を表示できます)。

MS WordのようにDisplay数式設定を使用する代替のワードプロセッサはありますか?かなり可能性があります。有料または無料の選択肢がいくつかあります。ただし、どの選択肢を選択しても、何らかの非互換性が生じます。

4
Jim K

Linux用のこの機能を備えたWordプロセッサはありそうにないことを受け入れたので、Rubyスクリプトを作成してJim Kの答えを自動化することにしました。

この問題の原因は、LibreOfficeがm:oMathPara XML要素を無視することです。これは、Wordが表示モードの方程式をラップして中央に配置し、独自の段落に配置することでもあります。

以下のRubyスクリプトは、Nokogiri XML解析ライブラリを使用して、m:oMathParaのすべての出現箇所を標準のw:p段落に置き換えます。これらの段落も中央揃えにフォーマットされています。次のことを行います。

  1. DOCX(コマンドライン引数として指定)を/tmpにコピーして解凍し、document.xmlを開きます
  2. m:oMathPara要素のXMLをスキャンします
  3. それらをフォーマットされたw:p要素で置き換えます
  4. DOCXを/tmpに再圧縮します
  5. LibreOfficeで結果のDOCXを開きます
  6. ユーザーが変更を保持するかどうかを尋ねます。 「はい」と答えた場合、変換されたDOCXは元のファイルにコピーされて上書きされます

これはあまりテストされていないため、万が一に備えて使用するファイルをバックアップする必要があります。 Linuxでのみ動作し、unzipツールをインストールする必要があることに注意してください。 (お持ちでない場合はユニバースにあります:Sudo apt install unzip。)gem install nokogiriも必要になる場合があります。

    #!/usr/bin/Ruby
# THIS IS LINUX ONLY!
# You'll also need to install `unzip`:
#     Sudo apt install unzip

require "pp"
require "Zip"
require "fileutils"
require "nokogiri"

def error(msg)
    puts msg
    exit
end

temp_dir = "/tmp/dispeqfix/"

filename = ARGV[0]

error "Please pass a filename as an argument." if filename.nil?

# Remove the directory if this tool has been run before
FileUtils.remove_dir(temp_dir) if Dir.exist? temp_dir

# Extract file as a Zip
%x{unzip '#{filename}' -d '#{temp_dir}'}

# Get path to document.xml, the file we need to modify
document_path = "/tmp/dispeqfix/Word/document.xml"
error "document.xml not found - are you sure this file is a DOCX?" unless File.exist? document_path

xml = Nokogiri::XML(File.read(document_path))

# 'm:oMathPara' is the element which LibreOffice doesn't support
xml.search("//m:oMathPara").each do |math_para|
    # Get the paragraph containing this one
    parent_para = math_para.parent

    # Get the 'm:oMath' contained within the 'm:oMathPara'
    math_para.dup.children.each do |math|
        # Insert a new paragraph with contains the 'm:oMath'
        new_para = Nokogiri::XML::Node.new("w:p", xml)
        math.parent = new_para
        parent_para.after(new_para)

        # Centre the paragraph
        math.before("<w:pPr><w:jc w:val=\"center\"/><w:rPr/></w:pPr><w:r><w:rPr/></w:r>")
    end

    math_para.remove
end

# Write this temporary file
File.write(document_path, xml.to_xml)

# Re-Zip and open it
%x{ cd /tmp/dispeqfix; Zip -r ../dispeqfix.docx * }
preview = spawn("libreoffice --writer /tmp/dispeqfix.docx 2>&1 > /dev/null", out: File::NULL)
Process.detach(preview)

# Prompt for overwrite
print "Would you like to overwrite the original document with this one? [y/n] "
if $stdin.gets.chomp == "y"
    %x{ cp -f /tmp/dispeqfix.docx #{filename} }
    puts "Overwritten."
else
    puts "No change made."
end
3