美国制造业的超级周期要来了!

青年就业难,可能低估了

《簡帛》 | 袁開慧、趙懷舟:老官山漢墓醫簡《醫馬書》簡27字詞考釋

云南永德芒果节开幕式:以节为媒 迎八方来客共享盛宴

曾建斌案的罪与罚

生成图片,分享到微信朋友圈

自由微信安卓APP发布,立即下载! | 提交文章网址
查看原文

推荐:五星级国象网站lichess.org

Jorende 国象若只如初见 2022-08-03



lichess.org这个网站原来也经常访问,最近看到群里有人发的来自此网站的局面,才意识到此网站并不简单。


一、虽是国外网站,但大部分网页都配置了中文,冲着这点,小朋友使用就不存在困难了。需要家长帮忙的可能就是要注册一下。


二、网站整体上简洁,操作顺手,连接稳定,不像chess.com经常掉线。网上在线人员数量众多。可以设置下棋模式,挑选对手,选择白方黑方。


三、可以做题,界面比chesstemple美观


四、可以练习,比如后车杀王,看带注释的棋局,像上网课一样,可惜视频看不了,因为都在youtube上


五、重点来了,可以把下过的棋、网站已有的的“研究”放在自己的数据库里,添上自己的标注,自己的想法,增加自己的变例,可以给大家共享,都上网上云上,随时可查


六、重点还有,支持将pgn棋局导入此网站,这样就不用在电脑上装fritz了,都存在云上,赞,真是良心网站。



奋战在战疫前线,医疗废物监管,

没有时间保证每天更新了。

武汉加油,中国必胜!祝大家平安!



棋爸联盟群里的一位棋爸用python程序可以研究里的pgn导成pdf打印我没掌握这个程序语言,分享一下大家可研究

#!/usr/bin/env python3# -*- coding: utf-8 -*-import argparseimport reimport sys
import chess.pgn
nags = dict(zip(range(1, 7), ['!', '?', '!!', '??', '!?', '?!']))
tex = """\\documentclass[11pt,twocolumn]{scrreprt}\\usepackage{CJK}\\usepackage{chessboard,xskak}\\usepackage{latexsym}\\usepackage[T1]{fontenc}\\usepackage{newunicodechar}\\usepackage[utf8]{inputenc}\\usepackage{graphicx}\\usepackage{xcolor}\\usepackage{xcolor}\\usepackage[margin=0.5in]{geometry}\\setlength{\\columnsep}{1cm}%%\\setlength{\\parskip}{1em}%%\\setlength{\\leftskip}{2em}%%\\setlength{\\parindent}{-2em}\\setlength{\\parindent}{0cm}
\\definecolor{var0}{HTML}{1B6031}\\definecolor{var1}{HTML}{601b28}\\definecolor{var2}{HTML}{541b60}
\\definecolor{var3}{HTML}{0d0d4b}\\definecolor{var4}{HTML}{4b2c0d}\\definecolor{var5}{HTML}{0d4b4b}
\\newcommand\\N[1]{%% \\noindent \\makebox[0pt][r]{\\makebox[1cm][l]{\\textbf{#1}}}%% \\hspace*{\\parindent}\\ignorespaces}
\\begin{document}\\begin{CJK*}{UTF8}{gbsn}\\newgameGAME\\end{CJK*}\\end{document}"""
NUM_COLOR = 0

def diagram(node, args, scale=None, position='center'): if not scale: if node.is_main_line(): scale = 0.95 else: scale = 0.8 # markmoves={a1-c3, b7-c6} # pgfstyle=circle, markfields=g1 # Mark last move if chosen move = ',pgfstyle=straightmove,markmoves={%s-%s}' % ( chess.SQUARE_NAMES[node.move.from_square], chess.SQUARE_NAMES[node.move.to_square]) if args.arrow_last_move else ''
# Get moves p = re.compile(r'\[%cal ([\w,]*)\]') m = p.search(node.comment) colors = {'G': 'green', 'R': 'red','B': 'gray','Y':'gray'} if m: arrows = m.group(1).split(',') move += ',pgfstyle=straightmove' for arrow in arrows: move += ',color=' + colors[arrow[0]] move += ',markmoves={%s-%s}' % (arrow[1:3], arrow[3:5])
# Mark squares p = re.compile(r'\[%csl ([\w,]*)\]') m = p.search(node.comment) colors = {'G': 'green', 'R': 'red','B':'gray','Y':'gray'} if m: squares = m.group(1).split(',') move += ',pgfstyle=circle' for square in squares: move += ',color=' + colors[square[0]] move += ',markfields=' + square[1:]
# Flip board if chosen flip = ',inverse' if args.flip else ''
# Add if position is right if position == 'flushright': move += ',color=lightgray!60,colorbackboard'
return '\\begin{%s}\\scalebox{%f}{\\chessboard[setfen=%s,vmarginwidth=.3em%s%s]}\\vspace{1ex}\\end{%s}\n' % ( position, scale, node.board().fen(), flip, move, position)

def format_line(line, level, args): if len(line) == 0: return ''
# Remove first move if it is empty if line[0].move is None: line = line[1:] if len(line) == 0: return ''
ret = '\\par\n\\%s{%s }' % ( 'variation', line[0].parent.board().variation_san([n.move for n in line]) if line[0].parent else '')
# Posat els nags if len(line[0].nags): n = ''.join([nags[n] for n in line[0].nags]) if '...' in ret: ret = re.sub(' ', n + ' ', ret, 1) else: ret = re.sub(r'^((.*? .*?){1}) ', r'\1%s ' % n, ret) if line[-1].comment: ret += ' %s\n' % re.sub(r'\[%c.*\]', '', line[-1].comment)
if line[-1].comment: ret += diagram(line[-1], args, scale=0.7, position='flushleft') if args.indent_variations: ret = '\\begin{addmargin}[%dem]{0cm}%s\\end{addmargin}' % (2*level, ret) return ret

def format_nodes(nodes, level, args): ret = '' line = [] for node in nodes: line.append(node) if node.comment: ret += format_line(line, level, args) line = []
ret += format_line(line, level, args) return ret

def parse(node, level, args): if node.is_end(): return ''
nodes = [] while len(node.variations) == 1 and not node.is_end() : nodes.append(node) node = node.variations[0] nodes.append(node)
ret = ''
if nodes[0].parent is not None: ret += diagram(nodes[0], args, scale=0.8)
ret += format_nodes(nodes, level, args)
if node.is_end(): #ret += diagram(node, args, scale=0.8, position='flushright') pass else: # For each variation for i, var in enumerate(node.variations[1:] + [node.variations[0]]): # Parse variation variant = parse(var, level+1, args)
# Add variation number if chosen if args.number_variations: variant = '\\N{%d.%d} %s' % (level, i+1, variant)
# Set color if chosen and not in main line if args.color and i != len(node.variations)-1: global NUM_COLOR variant = '{\\color{var%d}%s}' % (NUM_COLOR % 6, variant) NUM_COLOR += 1
# Add variation to tex ret += variant
return ret

if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("pgn", help="PGN file with games and variants") parser.add_argument("--number-variations", action='store_true') parser.add_argument("--indent-variations", action='store_true') parser.add_argument("--arrow-last-move", action='store_true') parser.add_argument("--diagrams-start-variation", action='store_true') parser.add_argument("--diagrams-end-variation", action='store_true') parser.add_argument("--color", help="use different colors for each variation", action='store_true') parser.add_argument("--flip", help="print boards from black's perspective", action='store_true') args = parser.parse_args()
# Open PGN pgn = open(args.pgn)
games_tex = '' while True: NUM_COLOR = 0 game = chess.pgn.read_game(pgn) if not game: break games_tex += '\\chapter*{%s}\n\\newgame\n' % game.headers['Event'] games_tex += parse(game, 0, args)
# Tex output file tex_fname = re.sub(r'pgn$', 'tex', args.pgn) with open(tex_fname, 'w') as fout: print(tex.replace('GAME', games_tex), file=fout)








文章有问题?点此查看未经处理的缓存