FENを使用して、PDF、Postscript、Windowsメタファイルなど、1200x1200 dpi以上で見栄えのよい高品質の図を生成できるソフトウェアを探しています。さまざまなチェスエンジンがそれを行うと思いましたが、それらの図はすべてビットマップであり(私の知る限り)、任意にサイズを変更するとゴミのように見えます。また、独自の公開エクスポートは、AFAICTの標準では編集できません。
支払うことを喜んで。
FENを使用して、PDF、Postscript、Windowsメタファイルなど、1200x1200 dpi以上で見栄えのよい高品質の図を生成できるソフトウェアを探しています。さまざまなチェスエンジンがそれを行うと思いましたが、それらの図はすべてビットマップであり(私の知る限り)、任意にサイズを変更するとゴミのように見えます。また、独自の公開エクスポートは、AFAICTの標準では編集できません。
支払うことを喜んで。
回答:
THBが指摘したように、ベクトルが必要です。python-chessを使用してSVGベクター画像を生成することをお勧めします。
複数のSVGを生成する必要があるかもしれないので、スクリプトを作成しましょう。そのため、スクリプトを使用して複数のチェスボードを簡単に生成できます。以下はPython 3.xで書かれています。Pythonスクリプト、たとえばFENtoSVG.pyを作成します。次のコードを挿入します。
import chess, sys
from chess import svg
'''
This imports python-chess module and sys module.
Python-chess will generate the boards while sys.argv will take
arguments for your script.
'''
svgstomake = (list(sys.argv))[1:]
for svgs in svgstomake:
board = chess.Board(svgs)
nameoffile = svgs.replace("/", "")+".SVG"
boardsvg = chess.svg.board(board = board)
filetowriteto = open(nameoffile, "w")
filetowriteto.write(boardsvg)
filetowriteto.close()
Linuxを使用している場合は、スクリプトを開始します#!/usr/bin/env python3
。
pythonを知っている場合、これは非常に単純なスクリプトですが、コーディングしていない人のために単純に保ちたいと思います。スクリプトを使用するには、スクリプトを保存したCMD / Terminalを開きます。次に、次のように使用します。
./FENtoSVG.py "examplefen" "morefen"
FENに2つのSVGが必要だ"8/8/8/8/4N3/8/8/8 w - - 0 1"
とし"8/8/8/8/4Q3/8/8/8 w - - 0 1"
、次のように入力します。
./FENtoSVG.py "8/8/8/8/4N3/8/8/8 w - - 0 1" "8/8/8/8/4Q3/8/8/8 w - - 0 1"
これは、2つのファイルを作成します。88884N3888 w - - 0 1.SVG
と88884Q3888 w - - 0 1.SVG
組み込み関数を使用してダイアグラムを簡単にカスタマイズできるため、python-chessをお勧めします。また、十分に文書化されています。
ベクトル形式は合うでしょう。
ご存じかもしれませんが、ベクター形式は、グラフィックをビットマップとしてではなく、幾何学的に、任意の縮尺でレンダリングできる数学的記述として表現します。
Web表示の場合、SVG形式を使用できます。ここでは SVG形式のいくつかの駒です。(リンクをたどると、チェスマンごとに「元のファイル(SVGファイル)」までクリックスルーします。クリックスルーするまで、ビットマップ化されたPNGがSVGに近似します。本物のSVGが必要です。)
PDF表示の場合、TeXには使用可能なパッケージがいくつかあります。以下にリストを示します。(これはTeXやLaTeXのに精通している場合にのみ便利である。しかし、結果として得られる図は良いです例えば、Pを参照してください4。。このPDFの例 Skakスタイルではまた、私はPを信じるの4。。このPDFの例を示していますあなたが好むかもしれないシュワルベチェススタイル、そのドキュメントはすべてドイツ語であるように思われます。これらはすべて、とにかくオープンソースです。
私の解決策は、チェスメリダやチェスケースなどのチェスフォントを使用することです。
たとえば、このようなフォントでは、開始位置は次のように記述されます。
1222222223
4tMvWlVmT5
4OoOoOoOo5
4 + + + +5
4+ + + + 5
4 + + + +5
4+ + + + 5
4pPpPpPpP5
4RnBqKbNr5
7888888889
そして(line-heightがフォントの高さに設定されていると仮定すると)次のようになります(ここではフォントとしてChess Meridaを使用しています):
そこで、fenからこの形式に変換するこのPythonスクリプトを書きました。このスクリプトを呼び出して(fen2diag.pyという名前を付けた場合)python fen2diag.py "<the fen>"
、ダイアグラム文字列を出力します。
import sys
def fen2diag(fen, borders=False):
"""
Convert a fen to a diagram string used by fonts like
'Chess Merida' and 'Chess Cases'.
fen: The fen. For example the fen for the startposition is
'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1'.
borders: If the returned diagram string shall have borders.
Returns the diagram string.
"""
# We dont need anything except the piece positions.
fen = fen[:fen.find(' ')]
# Transposition table for the black pieces.
# White pieces are the same in both formats.
t = {'k': 'l', 'q': 'w', 'r': 't', 'b': 'v', 'n': 'm', 'p': 'o'}
# If the current square is a white square or not.
w = False
def todiagletter(fenletter):
""""
Return the diagram letter corresponding to the letter in the fen.
"""
nonlocal borders, w
w = not w
if fenletter == '/':
# In the diagram font these are the characters for the diagram borders:
# '1' upper left, '2' upper, '3' upper right,
# '4' left, '5' right,
# '7' bottom left, '8' bottom, '9' bottom right
return '5\n4' if borders else '\n'
else:
# this code handles numbers in the fen, denoting empty squares.
try:
# this is a number between 1 and 8.
n = int(fenletter)
# This will be a string denoting empty squares.
# Would be eg. ' + + + +' for an empty eight rank.
spaces = []
while n > 0:
# In the diagram font ' ' denotes a white square
# and '+' denotes a black square.
spaces.append(' ' if w else '+')
w = not w
n -= 1
w = not w
return ''.join(spaces)
# this code handles piece letters in the fen.
except ValueError:
# a black piece
if fenletter in t:
fenletter = t[fenletter]
# In the diagram font lowercase letters denote
# pieces on white squares and uppercase letters
# denote pieces on black squares.
return fenletter.lower() if w else fenletter.upper()
diagram = ''.join(map(todiagletter, fen))
if borders:
return f'1222222223\n4{diagram}5\n7888888889'
else:
return diagram
if __name__ == '__main__':
print(fen2diag(sys.argv[1], borders=True))
これらのダイアグラムフォントは、ドットまたは星でマークされた正方形、別の種類の境界線、丸い境界角、行/列を示す左/下の境界線上の数字/文字もサポートします。スクリプトにはこれを含めていません。コードを自由に更新してください。
Chessbaseはフォントファミリも作成し(「DiagramTT ...」で始まる)、さらに多くのもの(180°回転したピースなど)をサポートしますが、このフォントは別のコードポイントにマップします。また、黒い四角には2つの文字が使用されます。背景用と作品用です。