Microsoft Wordには、方程式を表示する2つの方法があります。 InlineおよびDisplayインライン方程式は(名前が示すように)テキストと一致しているため、方程式とテキストを混在させることができます。表示方程式は、次のように独自の行に表示され、自動的に中央揃えされます。
これらは3つの独立した方程式ですが、表示モードに設定されているため、すべて中央揃えで独自の線上に表示されます。モードがインラインに変更された場合、それらはすべて同じ行に表示され、代わりに中央に配置されません。
私の問題は、LibreOfficeが、docxファイルでdisplay-modeに設定されている場合でも、インラインモードを使用してすべての方程式を表示することです。表示モードの方程式Wordを使用して最初の例を作成し、保存してからLibreOfficeで開くと、方程式はインラインモードであるかのように表示されます。
Wordのように、表示モードの方程式を独自の行に合わせて中央揃えにするために変更できる設定はありますか?私の持っているWord文書は膨大な量であるため、文書を個別に変更したくない。
そうでない場合、方程式を正しく表示する代替のワープロはありますか?
数式がLibreOfficeに挿入されると、デフォルトでAs Character
アンカーされます。
これは、キャラクターと同じように動作することを意味します。したがって、3つの文字がある場合と同じように処理します。たとえば、3つの方程式ではなく「abc」です。
現在、3つの方程式はすべて中心にあり、別々の行にあります。
「abc」の例に対するこれらの命令の結果は、数式が文字と同じように動作することを示しています。 (押す Enter 大文字の「A」に自動修正されます)。
これをMS WordとLibreOfficeの両方で機能させるには、おそらくInline設定のみを使用してください。ただし、これを確認するためのMS Wordのコピーはなく、Word Onlineでは数式を編集できません(ただし、必要な場合は数式を表示できます)。
MS WordのようにDisplay数式設定を使用する代替のワードプロセッサはありますか?かなり可能性があります。有料または無料の選択肢がいくつかあります。ただし、どの選択肢を選択しても、何らかの非互換性が生じます。
Linux用のこの機能を備えたWordプロセッサはありそうにないことを受け入れたので、Rubyスクリプトを作成してJim Kの答えを自動化することにしました。
この問題の原因は、LibreOfficeがm:oMathPara
XML要素を無視することです。これは、Wordが表示モードの方程式をラップして中央に配置し、独自の段落に配置することでもあります。
以下のRubyスクリプトは、Nokogiri XML解析ライブラリを使用して、m:oMathPara
のすべての出現箇所を標準のw:p
段落に置き換えます。これらの段落も中央揃えにフォーマットされています。次のことを行います。
/tmp
にコピーして解凍し、document.xml
を開きますm:oMathPara
要素のXMLをスキャンしますw:p
要素で置き換えます/tmp
に再圧縮しますこれはあまりテストされていないため、万が一に備えて使用するファイルをバックアップする必要があります。 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