Perangkat lunak diagram berkualitas tinggi (bukan bitmap)

14

Saya mencari perangkat lunak yang dapat mengambil FEN dan menghasilkan berkualitas tinggi diagram, di PDF, Postscript, Windows metafile, atau sesuatu yang lain yang akan terlihat baik di 1200x1200 dpi atau lebih baik. Saya pikir berbagai mesin catur akan melakukannya, tetapi diagram mereka semua bitmap (sejauh yang saya tahu) dan terlihat seperti sampah ketika diubah ukurannya secara sewenang-wenang. Juga, ekspor penerbitan mereka sendiri tidak dapat diedit dalam standar apa pun, AFAICT.

Bersedia untuk membayar.

Andrew Lazarus
sumber
Lihat apronus.com/chess/diagram/editor/… - Mungkin diagram sebesar ini akan memenuhi kebutuhan Anda. Bagaimanapun, Anda dapat menghubungi webmaster (saya) tentang menyesuaikan alat dengan kebutuhan spesifik Anda.
DrCapablasker
Seperti yang saya tulis di komentar saya sebelumnya, saya dapat menyediakan alat yang Anda butuhkan. Saya berpikir untuk membuat diagram SVG dari masing-masing file SVG untuk setiap bagian. Anda telah memulai hadiah tanpa menghubungi saya seperti yang saya sarankan.
DrCapablasker
Anda dianggap paket Lateks "SKAK": Link ? Itu bisa langsung mengambil string FEN.
U. Hjort

Jawaban:

11

Seperti yang ditunjukkan, Anda perlu vektor. Saya sarankan Anda menggunakan python-catur untuk menghasilkan gambar vektor SVG.

Prasyarat:

  1. Python 2.6+ atau 3.3+
  2. Catur python :
    • Instal formulir pypi menggunakan pip:pip install python-chess[uci,gaviota]

Membuat skrip

Karena Anda mungkin perlu membuat beberapa SVG, mari buat skrip. Jadi, Anda dapat menggunakan skrip untuk menghasilkan beberapa papan catur dengan mudah. Berikut ini ditulis dengan Python 3.x. Buat skrip Python, FENtoSVG.py misalnya. Masukkan kode berikut:

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()

Jika Anda menggunakan linux, mulai skrip dengan #!/usr/bin/env python3.

Pemakaian

Sekarang, ini adalah skrip yang sangat sederhana jika Anda tahu python tapi saya ingin membuatnya tetap sederhana bagi mereka yang tidak kode. Untuk menggunakan skrip, buka CMD / Terminal tempat Anda menyimpan skrip. Kemudian, gunakan sebagai berikut:

./FENtoSVG.py "examplefen" "morefen"

Katakanlah saya ingin dua SVG untuk FEN "8/8/8/8/4N3/8/8/8 w - - 0 1"dan "8/8/8/8/4Q3/8/8/8 w - - 0 1" , saya akan memasukkan:

./FENtoSVG.py "8/8/8/8/4N3/8/8/8 w - - 0 1" "8/8/8/8/4Q3/8/8/8 w - - 0 1"

Ini akan membuat dua file: 88884N3888 w - - 0 1.SVGdan88884Q3888 w - - 0 1.SVG

Saya menyarankan python-catur karena kustomisasi yang dapat dengan mudah dibuat ke diagram menggunakan fungsi bawaan. Juga didokumentasikan dengan baik.

MrFregg
sumber
Selamat atas rekomendasi yang jelas, mudah digunakan dan komprehensif, @Fluxenein. Saya melihat pendekatan ini untuk kebutuhan penerbitan saya. Selamat datang di komunitas!
Jaxter
Terima kasih! Ini masih tugas yang membosankan bagi saya jadi saya mungkin akan terus memperbarui sampai saya membuat / menemukan solusi yang cukup cepat untuk kebutuhan saya juga.
MrFregg
Pemberian hadiah karena ini adalah yang terbaik sejauh ini, tetapi kami memiliki cara untuk pergi untuk sesuatu yang terintegrasi dengan pengolah kata.
Andrew Lazarus
tips hebat tentang perpustakaan yang hebat. apakah ada contoh menentukan panah untuk langkah terakhir, atau gaya papan? untuk mengklarifikasi - ingin melakukannya bukan melalui ./FENtoSVG.py, melainkan dalam skrip saya sendiri melalui python-chess.
Joe
3

Sebuah format vektor akan sesuai.

Seperti yang Anda ketahui, format vektor mewakili grafik bukan sebagai bitmap tetapi secara geometris, sebagai deskripsi matematis yang dapat ditampilkan pada skala apa pun.

Untuk tampilan web, Anda dapat menggunakan format SVG. Berikut adalah beberapa catur dalam format SVG. (Jika Anda mengikuti tautan, untuk setiap catur, klik ke "file asli (file SVG)." Sampai Anda mengklik, semua yang Anda dapatkan adalah bitmap, perkiraan PNG ke SVG. Anda menginginkan SVG yang sebenarnya.)

Untuk tampilan PDF, TeX memiliki beberapa paket yang dapat Anda gunakan. Ini daftar. (Ini nyaman hanya jika Anda terbiasa dengan TeX atau LaTeX; tetapi diagram yang dihasilkan baik. Misalnya, lihat hal. 4 dari contoh PDF ini dalam gaya Skak. Selain itu, saya percaya bahwa hal. 4 dari contoh PDF ini menunjukkan gaya Schwalbe-catur, yang mungkin Anda sukai, meskipun dokumentasinya tampaknya semuanya dalam bahasa Jerman. Semua ini open source, bagaimanapun juga.)

thb
sumber
1
Saya pikir diagram dalam contoh terakhir Anda (harmonie) berkualitas rendah. Kotak putih menggunakan terlalu sedikit ruang horisontal, sehingga mereka terlalu jauh ke kiri, meninggalkan celah besar antara file-h dan tepi papan. Diagram-diagram itu tampak bagi saya seolah-olah dibuat dengan paket LaTeX "catur-masalah-diagram", yang tersedia di ctan.org/tex-archive/macros/latex/contrib/… . Diagram yang saya buat menggunakan paket itu memiliki bug yang sama.
Rosie F
3

Solusi saya adalah menggunakan font catur seperti Chess Merida atau Chess Cases .

Dengan font seperti misalnya posisi awal ditulis seperti ini:

1222222223
4tMvWlVmT5
4OoOoOoOo5
4 + + + +5
4+ + + + 5
4 + + + +5
4+ + + + 5
4pPpPpPpP5
4RnBqKbNr5
7888888889

Dan (dengan asumsi ketinggian garis diatur ke ketinggian font) terlihat seperti ini (Di sini menggunakan font Catur Merida ):

masukkan deskripsi gambar di sini

Jadi saya menulis skrip Python ini yang mengubah dari fen ke format ini. Panggil skrip ini (dengan asumsi Anda menamainya fen2diag.py ) dengan python fen2diag.py "<the fen>"dan mencetak string diagram.

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))

Font Diagram ini juga mendukung kotak yang ditandai dengan titik atau bintang, jenis perbatasan lainnya, sudut perbatasan bundar, angka / huruf pada batas kiri / bawah yang menunjukkan baris / kolom. Saya belum memasukkan ini ke dalam skrip. Jangan ragu untuk memperbarui kode saya.

Chessbase juga telah membuat keluarga font (dimulai dengan 'DiagramTT ...') yang mendukung lebih banyak barang (seperti potongan yang diputar 180 °) tetapi font ini memetakan berbagai hal ke titik kode yang berbeda, juga untuk kotak hitam dua huruf diambil, satu untuk latar belakang dan satu untuk bagian.

Nils
sumber